home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / basic / Mildred.lha / text / Mildred.ascii < prev    next >
Text File  |  2000-03-02  |  866KB  |  27,252 lines

  1. .Mildred ; Mistress of chunky magic
  2.  
  3. ;**********************************************************************
  4. ;
  5. ;$VER:Mildred V1.51 (21/10/1998)-(22/05/1999)&(27/02/2000)-(03/03/2000)
  6. ;
  7. ;Copyright (c) 1998-2000, Paul Jonathan West.
  8. ;
  9. ;**********************************************************************
  10.  
  11. ;History
  12. ;v1.1  - First public release
  13. ;v1.11 - Fixed bug in MUseShapeBank and altered ShapesTotal size to word as it was incorrectly a longword
  14. ;      - Fixed bug in the errorchecking of Mc2pCPUmode that was checking d3 instead of d0
  15. ;v1.12 - Fixed bug in MUnQueue that would only do two lines of code if wrapping was active, but should have been done always
  16. ;v1.13 - MBoxF, MBoxFShape, MBoxFStencil and MBoxFCookie added
  17. ;      - MBox, MBoxShape, MBoxStencil and MBoxCookie added
  18. ;v1.14 - MPlanar16ToBitmap, MPlanar16ToShape added
  19. ;v1.15 - Planar-to-chunky converter optimised further using addx and reverse bitplane order, twice as fast as roxr.b #n,dn
  20. ;      - MGenericPtr added
  21. ;      - A shape's handle is unconditionally added (actually subtracted) to Xpos,Ypos in shape-to-bitmap type blits (MBlit etc)
  22. ;v1.16 - Fixed small bug in !PerformPoint macro, d6.l should have been d6.w.
  23. ;      - Fixed small but ineffective bug in MPlotCookie, d6.l should have been d6.w
  24. ;v1.17 - Added MCludgeCookie and MCludgeStencil, also needed to add two macros
  25. ;      - Fixed bug in macro used by MCludgeCookie and MCludgeStencil, as it was not setting `SHere' to 0 to indicate cludge.
  26. ;v1.18 - Added MUnQueueRange for unqueuing a range of items and without flushing the queue
  27. ;v1.19 - Fixed bug in data for shape banks, was using structures of 8 bytes but only were 6 bytes in mem
  28. ;      - Fixed bug in MReserveShapes, was shifting bank number 8 places instead of 3
  29. ;v1.2  - Added MReMap and MReMapShape
  30. ;v1.21 - Fixed bug in macro DeallocStencil, was killing the whole object
  31. ;v1.22 - Commented-out line in MShapeClip and MBitmapClip to make X leftedge unaligned (width is still multiple of 4)
  32. ;      - Commented-out line in Macro CludgeResourceWindow to make X leftedge unaligned (width of window is still multiple of 4)
  33. ;v1.23 - Added mode to MBlit so that if a cookie is not present it will just blit the graphic in `replace'-mode (unmasked)
  34. ;      - Minor pipeline improvement in macros !PerformPlot and !PerformPoint
  35. ;      - Added code to the init routine to reserve default amounts of all objects at runtime (doesn't need much mem)
  36. ;      - Added `BankToUse' parameter to MReserveShapes so that you don't have to do a seperate MUseShapeBank
  37. ;      - Changed BoxF and Box routines to use X2,Y2 instead of Width,Height and had to add macro CCheckWindowFits4
  38. ;v1.24 - Made the colour parameter in MPlot,MPlotShape,MPlotStencil and MPlotCookie optional, assuming 0 if not specified
  39. ;      - *Partially* Added MLine, MLineShape, MLineStencil and MLineCookie
  40. ;      - Modified shapebank-related routines to provide 32 shape banks numbered 0..31, instead of 0..9.
  41. ;      - Fixed bugs in macros ShuffleRegs1, ShuffleRegs2 and ShuffleRegs3
  42. ;v1.25 - Added MReMapUsingShape and MReMapShapeUsingShape
  43. ;v1.26 - Optimised routine PerformReMapUsing for slight speed gain
  44. ;      - Optimised routine PerformReMap for 25% speed gain in table mode
  45. ;      - Fixed bug in macro CCheckWindowFits4, which affected runtime errorchecking of MBox/MBoxF and related routines
  46. ;v1.27 - Added MInk for setting a currently-used pen colour. Defaults to 1 which is a bit more logical than 0
  47. ;      - Added MColourMode function to accompany CookieMode/SolidMode etc, but for `colour' drawing mode in blits
  48. ;      - Added `colour' mode to MBlit, MQBlit, MSBlit, MQSBlit and MMaskScroll routines
  49. ;      - Removed redundant instruction in routine PerformBlit3's loop, for cookie-mode stencil-blits (slight speedup)
  50. ;      - Adjusted graphics routines to use the ink colour if assuming which colour to use, rather than 0
  51. ;      - Further optimised routine PerformReMapUsing for slight speedup (about 1-2fps)
  52. ;      - Changed order of tables being used for MReMap[Shape]UsingShape, for consistency with `MReMapMode' blit mode
  53. ;      - Added support for new Table objects
  54. ;      - Added MReserveTables, MFreeTables, MFreeTable, MAddrTable, MTable
  55. ;      - Added MFlushTable, MAutoUseTables, MUseTables, MUseTable, MUsedTable
  56. ;      - Added MTablePtr, MReMapMode
  57. ;      - Added new blit mode `ReMap' to the MBlit, MQBlit, MSBlit, MQSBlit and MMaskScroll routines for table-based remapping
  58. ;v1.28 - Optimised MPictureDissolveIn for speed gain (a good few fps)
  59. ;      - Added MSimpleReMapMode
  60. ;      - Added new blit mode `SimpleReMap' to the MBlit, MQBlit, MSBlit, MQSBlit and MMaskScroll routines for 1-dim remapping
  61. ;      - Fixed bug in definitions, MPointStencil and MPointCookie were defined as statements, but should have been functions
  62. ;      - Changed the !PerformPoint macro to initialise d0 before grabbing the byte, in case it causes corrupt return value
  63. ;v1.29 - Optimised non-cut routine used by MSMaskScrolls (PerformGenericBlit6[b])
  64. ;      - Slight optimisation to non-cut plain copy routine used by M[Q]SBlits (PerformBlit2)
  65. ;      - Finished MLine, MLineShape, MLineStencil and MLineCookie
  66. ;v1.30 - Redirected routine PerformGenericBlit3[b] to use PerformBlit1[b], to save code redundancy, and made gen3b into 1b
  67. ;      - Added MSMaskScrollMode to support blit modes for MSMaskScrolls (previously only MMaskScrolls)
  68. ;      - Redirected routine PerformGenericBlit6[b] to use PerformBlit2[b], to prepare for shared sblit blit-mode code
  69. ;      - Redirected routine PerformGenericBlit9[b] to use PerformBlit3[b], to prepare for shared sblit cut blit-mode code
  70. ;      - Completed support for MSMaskScrolls in `copy' mode with blit modes, by adding PerformBlit2b (2 backwards)
  71. ;      - Completed support for MSMaskScrolls in `cut' mode with blit modes, by adding PerformBlit3b (3 backwards)
  72. ;      - Modified runtime errorchecking routines for MSMaskScrolls to check that tables are available in M[Simple]ReMapMode
  73. ;v1.31 - Modified MScroll routines to support any width (non multiple, as low as 1).
  74. ;      - Modified MSScroll routines to support any width (non multiple, as low as 1) in both `paste' and `cut' modes.
  75. ;v1.32 - Fixed bugs in routine PerformBlit2[b] for non-cut output to stencil. Some OR's should have been AND's, and vice versa.
  76. ;v1.33 - Fixed bug in routine PerformLine, sometimes d5 was plotted rather than d6
  77. ;v1.34 - Added MPlotParticles for plotting list of pixels to a colour. List items are X.w,Y.w
  78. ;      - Added MGrabParticles for grabbing list of pixels to a buffer. List items are X.w,Y.w. Buffer is Pixel.b's
  79. ;      - Added MDrawParticles for drawing grabbed list of pixels from a buffer. List items are X.w,Y.w. Buffer is Pixel.b's
  80. ;      - Added MGrabParticlesAndPlot for grabbing and plotting pixels to a colour. List items are X.w,Y.w. Buffer is Pixel.b's
  81. ;      - Fixed bug in initialisation, auto-clip for bitmaps and shapes shouldn't have been automatically On!
  82. ;      - Added MPlotParticlesA, MGrabParticlesA, MDrawParticlesA, MGrabParticlesAndPlotA, for actual-address list items
  83. ;      - Added MPlotParticlesQ, MGrabParticlesQ, MDrawParticlesQ, MGrabParticlesAndPlotQ, for X.q,Y.q items [*16*.16][*16*.16]
  84. ;      - Added MAddToParticles, MAddToParticlesA, MAddToParticlesQ, for adding values to particle list items
  85. ;      - Added MAdd2ToParticles, MAdd2ToParticlesA, MAdd2ToParticlesQ, for more efficient multiple adds to list items
  86. ;v1.35 - Added MWrapParticles, MWrapParticlesA, MWrapParticlesQ, to wrap coords around edges of bitmap/clip (within reason)
  87. ;      - Fixed bugs in clip routine of MAddToParticlesQ and MAdd2ToParticlesQ, offsets and adders and adding were wrong
  88. ;      - Fixed bugs in clip routine of MWrapParticles and MWrapParticlesQ, 2 conditional branches to loop missing
  89. ;v1.36 - Added MReboundParticles and MReboundParticlesQ, for bouncing particless off the edges. No `A' version, not possible
  90. ;      - Fixed bugs in MLine, MLineShape, MLineStencil, MLineCookie, short version used wrong colour
  91. ;      - Added MProcessor function, to replace blitz's `Processor' instruction and support 060
  92. ;      - Modified various cpu-related routines (c2p and 040 choices) to support possible 060 cpu number
  93. ;      - Modified init routine to check for cpu availability and set MCPU, Mc2pCPUmode and M040c2pUsage to appropriate defaults
  94. ;v1.37 - Added MAddXYToParticles and MAddXYToParticlesQ for adding X and Y constants to X and Y components in a particle list
  95. ;      - Added MAddXYToParticlesA to add constant value to list of Ptr.l particles
  96. ;      - Added MAddXToParticles, MAddYToParticles, MAddXToParticlesQ and MAddYToParticlesQ for further adding to particle lists
  97. ;v1.38 - Removed unnecessary code from MPlotParticlesA, MGrabParticlesA, MDrawParticlesA and MGrabParticlesAndPlotA
  98. ;      - Added MParticleMode to choose MColourMode, MReMapMode or MSimpleReMapMode for particle plot/draw
  99. ;      - Added MSimpleReMapMode and MReMapMode support to MPlotParticles, MPlotParticlesA and MPlotParticlesQ (clipping also!)
  100. ;      - Added MSimpleReMapMode and MReMapMode support to MDrawParticles, MDrawParticlesA and MDrawParticlesQ (clipping also!)
  101. ;      - Added MSimpleReMapMode and MReMapMode support to MGrabParticlesAndPlot[A/Q] for remap plot and normal grab (and clip!)
  102. ;      - Merged MAdd2ToParticles[A/Q] into extension of MAddToParticles[A/Q] to make friendlier interface & cut down on tokens
  103. ;      - Token order has been compromised due to removal of MAdd2ToParticles, MAdd2ToParticlesA and MAdd2ToParticlesQ !!!
  104. ;      - Fixed errornumber bugs in errorchecking routines of MShapePtr and MCookiePtr. Was Error28, should have been Error27
  105. ;      - Added support to MBitmapPtr, MStencilPtr, MShapePtr and MCookiePtr to assume currently used objects if no params
  106. ;      - Merged MAddXToParticles[Q] into special-case routine of MAddXYToParticles[Q] (called if Y is 0)
  107. ;      - Merged MAddYToParticles[Q] into special-case routine of MAddXYToParticles[Q] (called if X is 0)
  108. ;      - Token order has been compromised due to removal of MAddXToParticles[Q] and MAddYToParticles[Q] !!!
  109. ;v1.39 - Optimised routine PerformLine for speedup and less instructions
  110. ;      - Expanded MInk to allow specification of second and third inks to use
  111. ;      - Slightly rearranged internal data area and ensured alignment without Even4's, ready for extensions to access
  112. ;      - Added MMildredBase to return the base address of Mildred's internal data area
  113. ;      - Added lib support for returning base of Mildred's internal data area to other libraries, at the end of Initialise
  114. ;v1.40 - Added CRsrc_TotWidth to resource structure, for shapes and bitmaps, and added support code in necessary routines
  115. ;      - Modified many routines to read CRsrc_TotWidth rather than move.w mem->reg, add.w mem->reg. Slight general speedups
  116. ;      - Rearranged part of Mc2pWindow to check and set auto-use at the start as it was possibly trashed by the CacheClearU_()
  117. ;v1.41 - Made MParticleMode, MBlitMode, MQBlitMode, MSBlitMode, MQSBlitMode, MMaskScrollMode and MSMaskScrollMode into commands
  118. ;      - Slightly modified MUnQueue, negligible speedup, but better pipelining
  119. ;      - Added MDrawingMode to change mode used for drawing operations such as MPlot, MLine, MBoxF etc
  120. ;      - Added MDrawingMode support to MCls family for InvMode, MColourMode, MReMapMode and MSimpleReMapMode (no stencil remap!)
  121. ;      - Added MDrawingMode support to MPlot family for InvMode, MColourMode, MReMapMode and MSimpleReMapMode (no stencil remap)
  122. ;      - Added MDrawingMode support to MBoxF family for InvMode, MColourMode, MReMapMode and MSimpleReMapMode (no stencil remap)
  123. ;      - Added MDrawingMode support to MBox family for InvMode, MColourMode, MReMapMode and MSimpleReMapMode (no stencil remap!)
  124. ;      - Added MDrawingMode support to MLine family for InvMode, MColourMode, MReMapMode and MSimpleReMapMode (no stencil remap)
  125. ;v1.42 - Moved _DrawingModeType in data area and made it into a word, as it was mistakenly defined as a byte so was trashing
  126. ;      - Fixed bugs in MSTile32x32 and MSTile32x32Store, wrapping was not implemented for the dest stencil
  127. ;      - Slightly optimised routine PerformRemap and fixed bug in PerformRemapUsingShape as top half of d4 needed to be cleared
  128. ;      - Slightly optimised MUnQueue (bitmap form), speedup of about 0.1fps!
  129. ;      - Fixed major bug in routine PerformBlit1, ReMap mode routine was doing stencil cut but should have been a straight blit
  130. ;      - Added optimisation as routines PerformBlit1[b]_16, to do groups of 16 pixels instead of 4 if the width is a multiple
  131. ;      - Made M[c2pWindow][Shape][Bitmap]Width and M[c2pWindow][Shape][Bitmap]Height work without specified object number
  132. ;      - Made MAddr[c2pWindow][Shape][Bitmap][Queue][Table] work without specified object number
  133. ;      - Optimised macro RemakeStencil, used for generating a stencil or cookie from a bitmap or shape
  134. ;      - Added optimisation as routines PerformBlit2[b]_16, to do groups of 16 pixels instead of 4 if the width is a multiple
  135. ;      - Fixed major bug in routines PerformBlit2[b][_16] and PerformBlit3[b] in SolidMode write to mask was or instead of and
  136. ;      - Recoded all tile blits in 030 mode from movem.l's to move.l's and done modulos different. 2-3fps faster, on 040.
  137. ;      - Added optimisation as routines PerformBlit3[b]_16, to do groups of 16 pixels instead of 4 if the width is a multiple
  138. ;      - Optimised GenericBlit (scroll) routines, optimised for when width is multiple of 16 or multilpes of 64 for blockscroll
  139. ;      - Fixed bug in all tokens that add items to a queue. Upper word of d7 was corrupt due to unusual longword usage
  140. ;v1.43 - Added MParticleFormat to select mode for particle tokens, between 0=word, <0=quick and >0=actual memory addresses
  141. ;      - Merged Word/Quick/Address versions of particle commands into single commands, using MParticleFormat to choose
  142. ;      - Removed MReMap[Shape]UsingShape commands as they have been superceded by MDrawingMode functionality
  143. ;      - Removed Mc2pToggleSingle, Mc2pToggleDouble and Mc2pToggleTriple, as you might as well just use Mc2pToggle.
  144. ;      - Removed the MInitShape token and just kept with MShape for making new shapes
  145. ;      - Renamed MUse[c2pWindows][Shapes][Bitmaps][Queues][Tables] to the singular versions and removed the plurals
  146. ;      - Removed MMidHandle, MMidOrigin, MCopyHandle and MCopyOrigin completely
  147. ;      - Removed the unused MFlushTable completely
  148. ;      - Removed M040c2pUsage and any other tokens associated with its status.
  149. ;      - Merged MMakeCookies into MMakeCookie and removed MMakeCookies token
  150. ;      - Merged MMakeStencils into MMakeStencil and removed MMakeStencils token
  151. ;      - Merged MFree[c2pWindows][Shapes][Bitmaps][Cookies][Stencils][Queues][Tables] to the singular and removed the plurals
  152. ;      - Tokenisation has been severly compromised due to changes, deletions and additions.!!
  153. ;v1.44 - Moved MPictureDissolveIn token to the end of the library and renamed the old one to MNothing as the 128th token fails
  154. ;v1.45 - Killed Mc2pRowLacing, Mc2pColumnLacing, Mc2pRowToggle, Mc2pColumnToggle and Mc2pToggle. Tokens 1-5 free for use!
  155. ;      - Removed all code relating to interlaced c2p conversion, especially from Mc2pWindow, Mc2p and data area
  156. ;      - Changed c2pWindow structure to 8 bytes instead of 16 and allowed c2p0_Pixels to be .w or .l depending on modulos>0
  157. ;      - Modified Mc2pWindow and Mc2p to support non-modulo c2p routine, and implemented non-modulo c2p (040 and 030) into Mc2p
  158. ;      - Added MPictureDissolveOut to wipe image to a colour, bit faster than cross-wiping to blank image in MPictureDissolveIn
  159. ;      - Modified MCludge[Shape][Bitmap][Cookie][Stencil] to take the `-16' away from the programmer making base address actual
  160. ;      - Merged MUnQueueRange into extra syntax option of MUnQueue, still able to unqueue range without flush or all with flush
  161. ;      - Added MBlockUnQueue in place of MUnQueueRange for unqueing items with width and X coord multiple of 16 (doesn't check)
  162. ;      - Modified clearscreen mode of MUnQueue and MBlockUnQueue to use current ink instead of just 0's
  163. ;      - Tried to add stencil-unqueue (cut behind stencil) but failed, not enough regs, so removed
  164. ;      - Slightly optimised clearscreen mode of M[Block]UnQueue to do forwards operation and (an)+ (removes need for mulu)
  165. ;      - Slightly optimised routine PerformCls in all relevant blit modes
  166. ;v1.46 - Added MWrapXParticles and MWrapYParticles to do wrapping of only sides or top/bottom. No X-wrap for Ptr.l, however.
  167. ;      - Added MAddToXParticles and MAddToYParticles to add list(s) to particles but only one of the two components (Not Ptr.l)
  168. ;      - Fixed small bug in errorchecking routine of MAddToParticles, check for zero address occured when address was negative
  169. ;      - Fixed bug in clipping version of .q 2-adder routine in MAddToParticles, a3 needed to have a skip value added
  170. ;v1.47 - Fixed bugs in routine PerformGenericBlit2[b], optimised routines were copying stencil also but should be data only
  171. ;      - Added CustomOffsets.l to MScroll family, for using list of custom Width.w,X1Offset.w,X2Offset.w,SourceModulo.w values
  172. ;      - Added CustomOffsets.l to MSScroll family, for using list of custom Width.w,X1Offset.w,X2Offset.w,SourceModulo.w values
  173. ;      - Fixed bugs in generic blit routines, beq should have been blt for skipping if byte loopcounter was empty (-1 not 0)
  174. ;      - Optimised remainder-byte checking in PerformGenericBlit2[b]/5[b], was no need to test for zero bytes
  175. ;      - Small optimisation, changing bsr to bra if the jump is the last instruction of a routine, as there is no need to stack
  176. ;      - Added LongwordStore.l to data area for temporary storage of longwords, like when stacking it would not be possible
  177. ;      - Fixed bugs in errorchecking routines of MPointShape and MPointCookie, was jumping to Error28 instead of Error27
  178. ;      - Added [,Source.w] parameter to MPoint[Shape][Stencil][Cookie] to specify a source bitmap/shape for the operation
  179. ;      - Added MZoom, MZoomShape, MZoomBitmapToShape and MZoomShapeToBitmap, for zoomed unmasked scrolls (+CustomOffsets list!)
  180. ;      - Added macros CCheckXYFits2 and CCheckXYFits3 for use by errorchecking routines of MZoom[Shape][To][Bitmap]
  181. ;v1.48 - Fixed bug in routine PerformBlit1_16, indirect offsets in SimpleRemap were 0..3,0..3,0..3,0..3 should have been 0..15
  182. ;      - Optimised (1fps+) some scrolls that copy the stencil/cookie, as interleaving the moves is faster than as bursts
  183. ;      - Optimised some blit modes in PerformBlit1/2/3[b][_16] using phase-shift, pipelining and interleaved mem accesses
  184. ;      - Optimised the 030 tile routines a bit when doing an STile, by interleaving the moves
  185. ;      - Optimised the SimpleReMap modes in PerformBlit1[b]_16/2[b]_16/3[b]_16 when width is multiple of 16 (gains up to 2fps)
  186. ;      - Optimised zoom routines. Zooms with non-integer x factor are about 4fps faster
  187. ;      - Optimised all zoom routines using addx method instead of swap/swap/add, gains of about 3-4fps
  188. ;      - Added DeRes?.w as last compulsory param of zoom tokens, and added de-res routines to zooms
  189. ;      - Optimised zoom routines for when x factor is 1.0 to do extra-fast y-zoom, many fps faster
  190. ;      - Attempted to rewrite routine PerformLine using .q loop with addx, but it performed slower due to need to use divu.w
  191. ;      - Optimised CustomZoom[DeRes] that uses CustomOffsets.l to do groups of 4 pixels if width is multiple, gain up to 2fps+
  192. ;v1.49 - Added MAddMode which returns mode number 7 for use with various graphics routines to choose `Add' operations
  193. ;      - Added full support throughout the lib for MAddMode routines, byte values of source and dest are simply added together
  194. ;      - Updated the descriptions of numerous tokens to better represent recent changes
  195. ;      - Fixed bug in single-colour section of routine PerformReMap, loopcounter was screwy
  196. ;v1.50 - Fixed bugs in MWrapXParticles and MWrapYParticles, loops were BGE and should have been BGT, causing 1 illegal loop
  197. ;      - Fixed bugs in check routines of MBox[F] family, as tables were being checked for in MAddMode (where not necessary)
  198. ;v1.51 - Work resumed 27/02/2000 for the first time since 22/05/1999, copyright ownership has been reclaimed
  199. ;      - Bug identified in PerformBlit1/2/3_16[b] MSimpleReMapMode. Masking isn't working right, shape's cookie is blocks of 4!
  200. ;      - Macro RemakeStencil optimised by changing SNE.b to SEQ.b and removing the NOT.l, slight speedup making cookie/stencil
  201. ;      - Fixed bug in PerformBlit1/2/3_16[b] MSimpleReMapMode. Replaced TST.l with CMP.l #-1, as it was skipping 4 instead of 1
  202. ;      - Design flaw: Programmers should beware that cludged cookies/stencils must share the same linemodulo as the main data
  203. ;      - Optimised macro PerformYFlip for improved speed Yflipping if width is multiple of 16
  204. ;      - Optimised/recoded macro PerformXFlip for improved speed Xflipping if width is multiple of 4 or 16. ScrollDemo is 1fps+
  205.  
  206. #MildredLibNum=15
  207.  
  208. #PlaneSize=4 ; Dummy c2p SMC value
  209. #LVOCacheClearU=-$27C
  210. #LVOAvailMem=-$D8
  211. #BlitzAllocmem=$c002
  212. #BlitzFreemem=$c003
  213. #ClearPublicMem=1|65536
  214. #AttnFlags=$128 ; ExecBase\AttnFlags offset
  215. #NumberOfShapeBanks=32
  216. #_MOVE16_a0_a1=$F6209000 ; Opcode for MOVE16 (a0)+,(a1)+
  217. #_MOVE16_a2_a3=$F622B000 ; Opcode for MOVE16 (a2)+,(a3)+
  218. #_MOVE16_a4_a5=$F624D000 ; Opcode for MOVE16 (a4)+,(a5)+
  219. #_MOVE16_a2_a0=$F6228000 ; Opcode for MOVE16 (a2)+,(a0)+
  220.  
  221. #c2pWindowStructSize=3 ; LSL for 8 bytes
  222. #ChunkyResourceStructSize=6 ; LSL for 64 bytes
  223. #ChunkyQueueStructSize=4 ; LSL for 16 bytes
  224. #ChunkyQueueListStructBytes=16 ; 16 bytes without LSL
  225. #ChunkyQueueListStructSize=4 ; LSL for 16 bytes
  226. #ChunkyTableStructSize=4 ; LSL for 16 bytes
  227.  
  228. #_CookieMode=$FCA
  229. #_EraseMode=$B0A
  230. #_InvMode=$B5A
  231. #_SolidMode=$BFA
  232.  
  233. !libheader {#MildredLibNum,Init,1,Finish,RunErrors}
  234.  
  235. ;Definitions
  236.  
  237. !astatement
  238. !args      {#long,#long}
  239. !libs
  240. !subs      {_MWrapXParticles,_MWrapXParticlesCheck,0}
  241. !name      {"MWrapXParticles","CoordinateList.l,NumPoints.l ; Bring particles in from left/right edges (Not Ptr.l)"}
  242.  
  243. !astatement
  244. !args      {#long,#long}
  245. !libs
  246. !subs      {_MWrapYParticles,_MWrapYParticlesCheck,0}
  247. !name      {"MWrapYParticles","CoordinateList.l,NumPoints.l ; Bring particles in from top/bottom edges"}
  248.  
  249. !astatement
  250. !args      {#long,#long,#long}
  251. !libs
  252. !subs      {_MAddToXParticlesShort,_MAddToXParticlesShortCheck,0}
  253. !args      {#long,#long,#long,#long}
  254. !libs
  255. !subs      {_MAddToXParticles,_MAddToXParticlesCheck,0}
  256. !name      {"MAddToXParticles","CoordinateList.l,NumPoints.l,IncA.l[,IncB.l] ; Add X components of [two sets of] increments"}
  257.  
  258. !astatement
  259. !args      {#long,#long,#long}
  260. !libs
  261. !subs      {_MAddToYParticlesShort,_MAddToYParticlesShortCheck,0}
  262. !args      {#long,#long,#long,#long}
  263. !libs
  264. !subs      {_MAddToYParticles,_MAddToYParticlesCheck,0}
  265. !name      {"MAddToYParticles","CoordinateList.l,NumPoints.l,IncA.l[,IncB.l] ; Add Y components of [two sets of] increments"}
  266.  
  267. !afunction {#long}
  268. !args
  269. !libs
  270. !subs      {_MAddMode,0,0}
  271. !name      {"MAddMode","; Returns value 7 which represents `add' mode in the blit modes"}
  272.  
  273. !astatement
  274. !args      {#byte}
  275. !libs
  276. !subs      {_Mc2pCPUmode,_Mc2pCPUmodeCheck,0}
  277. !name      {"Mc2pCPUmode","CPU.b ; Set cpu c2p uses. Use `MProcessor' or `Processor'. <4=030-, >3=040+"}
  278.  
  279. !astatement
  280. !args      {#word,#word,#word}
  281. !libs
  282. !subs      {_Mc2pWindowBriefShort,_Mc2pWindowBriefShortCheck,0}
  283. !args      {#word,#word,#word,#byte}
  284. !libs
  285. !subs      {_Mc2pWindowBrief,_Mc2pWindowBriefCheck,0}
  286. !args      {#word,#word,#word,#word,#word,#word}
  287. !libs
  288. !subs      {_Mc2pWindowShort,_Mc2pWindowShortCheck,0}
  289. !args      {#word,#word,#word,#word,#byte,#word,#word}
  290. !libs
  291. !subs      {_Mc2pWindow,_Mc2pWindowCheck,0}
  292. !name      {"Mc2pWindow","c2pWindow#.w,OpWidth.w,OpHeight.w[,SourceBWidth.w[,Processor.b],PlanarWidth.w,PlanarHeight.w]"}
  293.  
  294. !afunction {#word}
  295. !args
  296. !libs
  297. !subs      {_Mc2pWindowWidthShort,_Mc2pWindowWidthShortCheck,0}
  298. !args      {#word}
  299. !libs
  300. !subs      {_Mc2pWindowWidth,_Mc2pWindowWidthCheck,0}
  301. !name      {"Mc2pWindowWidth","[(c2pWindowNumber.w)] ; Returns width of c2pWindow"}
  302.  
  303. !afunction {#word}
  304. !args
  305. !libs
  306. !subs      {_Mc2pWindowHeightShort,_Mc2pWindowHeightShortCheck,0}
  307. !args      {#word}
  308. !libs
  309. !subs      {_Mc2pWindowHeight,_Mc2pWindowHeightCheck,0}
  310. !name      {"Mc2pWindowHeight","[(c2pWindowNumber.w)] ; Returns height of c2pWindow"}
  311.  
  312. !astatement
  313. !args      {#word,#word}
  314. !libs
  315. !subs      {_Mc2pWindowNewHeight,_Mc2pWindowNewHeightCheck,0}
  316. !name      {"Mc2pWindowNewHeight","c2pWindow#.w,NewHeight.w ; Change height of already defined c2p object"}
  317.  
  318. !astatement
  319. !args      {#long}
  320. !libs
  321. !subs      {_Mc2pShortest,_Mc2pShortestCheck,0}
  322. !args      {#long,#long}
  323. !libs
  324. !subs      {_Mc2pShort,_Mc2pShortCheck,0}
  325. !args      {#word,#long,#long}
  326. !libs
  327. !subs      {_Mc2p,_Mc2pCheck,0}
  328. !name      {"Mc2p","[[c2pWindow#.w],Chunky.l],Planar.l ; Convert chunky to planar (Use Mc2pWindow first)"}
  329.  
  330. !acommand  {#long}
  331. !args      {#word}
  332. !libs
  333. !subs      {_MReservec2pWindows,_MReservec2pWindowsCheck,0}
  334. !name      {"MReservec2pWindows","[(]NumberOfWindows.w[)] ; Reserve structure-memory for c2pWindows"}
  335.  
  336. !acommand  {#long}
  337. !args      {#word}
  338. !libs
  339. !subs      {_MReserveChunkyShapesShort,_MReserveChunkyShapesShortCheck,0}
  340. !args      {#word,#word}
  341. !libs
  342. !subs      {_MReserveChunkyShapes,_MReserveChunkyShapesCheck,0}
  343. !name      {"MReserveShapes","[(]NumberOfShapes.w[,ShapeBankToUse.w][)] ; Reserve structure-memory for Shapes"}
  344.  
  345. !acommand  {#long}
  346. !args      {#word}
  347. !libs
  348. !subs      {_MReserveChunkyBitmaps,_MReserveChunkyBitmapsCheck,0}
  349. !name      {"MReserveBitmaps","[(]NumberOfBitmaps.w[)] ; Reserve structure-memory for Bitmaps"}
  350.  
  351. !acommand  {#long}
  352. !args      {#word,#word,#word}
  353. !libs
  354. !subs      {_MChunkyShape,_MChunkyShapeCheck,0}
  355. !name      {"MShape","[(]ShapeNumber.w,Width.w,Height.w[)] ; Allocmem for shape data"}
  356.  
  357. !acommand  {#long}
  358. !args      {#word,#word,#word}
  359. !libs
  360. !subs      {_MChunkyBitmap,_MChunkyBitmapCheck,0}
  361. !name      {"MBitmap","[(]BitmapNumber.w,Width.w,Height.w[)] ; Allocmem for bitmap data"}
  362.  
  363. !astatement
  364. !args      {#byte}
  365. !libs
  366. !subs      {_MAutoChunkyShapeCookie,0,0}
  367. !name      {"MAutoCookie","On/Off ; Autocreation of ByteForByte cookies"}
  368.  
  369. !astatement
  370. !args      {#byte}
  371. !libs
  372. !subs      {_MAutoChunkyBitmapStencil,0,0}
  373. !name      {"MAutoStencil","On/Off ; Autocreation of ByteForByte stencils"}
  374.  
  375. !astatement
  376. !args      {#word,#word}
  377. !libs
  378. !subs      {_MFreec2pWindowsRange,_MFreec2pWindowsRangeCheck,0}
  379. !args
  380. !libs
  381. !subs      {_MFreec2pWindows,_MFreec2pWindowsCheck,0}
  382. !args      {#word}
  383. !libs
  384. !subs      {_MFreec2pWindow,_MFreec2pWindowCheck,0}
  385. !name      {"MFreec2pWindow","[Firstc2pWindow.w[,Lastc2pWindow.w]] ; Free a c2pWindow, range of c2pWindows or all c2pWindows"}
  386.  
  387. !astatement
  388. !args      {#word,#word}
  389. !libs
  390. !subs      {_MFreeChunkyShapesRange,_MFreeChunkyShapesRangeCheck,0}
  391. !args
  392. !libs
  393. !subs      {_MFreeChunkyShapes,_MFreeChunkyShapesCheck,0}
  394. !args      {#word}
  395. !libs
  396. !subs      {_MFreeChunkyShape,_MFreeChunkyShapeCheck,0}
  397. !name      {"MFreeShape","[FirstShape.w[,LastShape.w]] ; Free a Shape, range of shapes, or all shapes"}
  398.  
  399. !astatement
  400. !args      {#word,#word}
  401. !libs
  402. !subs      {_MFreeChunkyBitmapsRange,_MFreeChunkyBitmapsRangeCheck,0}
  403. !args
  404. !libs
  405. !subs      {_MFreeChunkyBitmaps,_MFreeChunkyBitmapsCheck,0}
  406. !args      {#word}
  407. !libs
  408. !subs      {_MFreeChunkyBitmap,_MFreeChunkyBitmapCheck,0}
  409. !name      {"MFreeBitmap","[FirstBitmap.w[,LastBitmap.w]] ; Free a Bitmap, range of bitmaps, or all bitmaps"}
  410.  
  411. !afunction {#word}
  412. !args
  413. !libs
  414. !subs      {_MChunkyShapeWidthShort,_MChunkyShapeWidthShortCheck,0}
  415. !args      {#word}
  416. !libs
  417. !subs      {_MChunkyShapeWidth,_MChunkyShapeWidthCheck,0}
  418. !name      {"MShapeWidth","[(ShapeNumber.w)] ; Returns width of Shape"}
  419.  
  420. !afunction {#word}
  421. !args
  422. !libs
  423. !subs      {_MChunkyBitmapWidthShort,_MChunkyBitmapWidthShortCheck,0}
  424. !args      {#word}
  425. !libs
  426. !subs      {_MChunkyBitmapWidth,_MChunkyBitmapWidthCheck,0}
  427. !name      {"MBitmapWidth","[(BitmapNumber.w)] ; Returns width of Bitmap"}
  428.  
  429. !afunction {#word}
  430. !args
  431. !libs
  432. !subs      {_MChunkyShapeHeightShort,_MChunkyShapeHeightShortCheck,0}
  433. !args      {#word}
  434. !libs
  435. !subs      {_MChunkyShapeHeight,_MChunkyShapeHeightCheck,0}
  436. !name      {"MShapeHeight","[(ShapeNumber.w)] ; Returns height of Shape"}
  437.  
  438. !afunction {#word}
  439. !args
  440. !libs
  441. !subs      {_MChunkyBitmapHeightShort,_MChunkyBitmapHeightShortCheck,0}
  442. !args      {#word}
  443. !libs
  444. !subs      {_MChunkyBitmapHeight,_MChunkyBitmapHeightCheck,0}
  445. !name      {"MBitmapHeight","[(BitmapNumber.w)] ; Returns height of Bitmap"}
  446.  
  447. !afunction {#long}
  448. !args
  449. !libs
  450. !subs      {_MAddrc2pWindowShort,_MAddrc2pWindowShortCheck,0}
  451. !args      {#word}
  452. !libs
  453. !subs      {_MAddrc2pWindow,_MAddrc2pWindowCheck,0}
  454. !name      {"MAddrc2pWindow","[(c2pWindowNumer.w)] ; Returns address of c2pWindow structure"}
  455.  
  456. !afunction {#long}
  457. !args
  458. !libs
  459. !subs      {_MAddrChunkyShapeShort,_MAddrChunkyShapeShortCheck,0}
  460. !args      {#word}
  461. !libs
  462. !subs      {_MAddrChunkyShape,_MAddrChunkyShapeCheck,0}
  463. !name      {"MAddrShape","[(ShapeNumber.w)] ; Returns address of Shape structure"}
  464.  
  465. !afunction {#long}
  466. !args
  467. !libs
  468. !subs      {_MAddrChunkyBitmapShort,_MAddrChunkyBitmapShortCheck,0}
  469. !args      {#word}
  470. !libs
  471. !subs      {_MAddrChunkyBitmap,_MAddrChunkyBitmapCheck,0}
  472. !name      {"MAddrBitmap","[(BitmapNumber.w)] ; Returns address of Bitmap structure"}
  473.  
  474. !astatement
  475. !args      {#word,#word,#word}
  476. !libs
  477. !subs      {_MChunkyShapeHandle,_MChunkyShapeHandleCheck,0}
  478. !name      {"MHandle","ShapeNumber.w,XOffset.w,YOffset.w ; Set handle of Shape"}
  479.  
  480. !astatement
  481. !args      {#word,#word,#word}
  482. !libs
  483. !subs      {_MChunkyBitmapOrigin,_MChunkyBitmapOriginCheck,0}
  484. !name      {"MBitmapOrigin","BitmapNumber.w,XOffset.w,YOffset.w ; Set origin of Bitmap"}
  485.  
  486. !astatement
  487. !args      {#word}
  488. !libs
  489. !subs      {_MUsec2pWindowShortest,_MUsec2pWindowShortestCheck,0}
  490. !args      {#word,#word}
  491. !libs
  492. !subs      {_MUsec2pWindowShort,_MUsec2pWindowShortCheck,0}
  493. !args      {#word,#word,#word}
  494. !libs
  495. !subs      {_MUsec2pWindow,_MUsec2pWindowCheck,0}
  496. !name      {"MUsec2pWindow","Mainc2pWindowNum.w[,Secondc2pWindowNum.w[,Thirdc2pWindowNum.w]] ; Current to use"}
  497.  
  498. !astatement
  499. !args      {#word}
  500. !libs
  501. !subs      {_MUseChunkyShapeShortest,_MUseChunkyShapeShortestCheck,0}
  502. !args      {#word,#word}
  503. !libs
  504. !subs      {_MUseChunkyShapeShort,_MUseChunkyShapeShortCheck,0}
  505. !args      {#word,#word,#word}
  506. !libs
  507. !subs      {_MUseChunkyShape,_MUseChunkyShapeCheck,0}
  508. !name      {"MUseShape","MainShapeNum.w[,SecondShapeNum.w[,ThirdShapeNum.w]] ; Current Shape(s) to use"}
  509.  
  510. !astatement
  511. !args      {#word}
  512. !libs
  513. !subs      {_MUseChunkyBitmapShortest,_MUseChunkyBitmapShortestCheck,0}
  514. !args      {#word,#word}
  515. !libs
  516. !subs      {_MUseChunkyBitmapShort,_MUseChunkyBitmapShortCheck,0}
  517. !args      {#word,#word,#word}
  518. !libs
  519. !subs      {_MUseChunkyBitmap,_MUseChunkyBitmapCheck,0}
  520. !name      {"MUseBitmap","MainBitmapNum.w[,SecondBitmapNum.w[,ThirdBitmapNum.w]] ; Current Bitmap(s) to use"}
  521.  
  522. !afunction {#word}
  523. !args
  524. !libs
  525. !subs      {_MUsedc2pWindow,_MUsedc2pWindowCheck,0}
  526. !name      {"MUsedc2pWindow"," ; Returns currently used c2pWindow"}
  527.  
  528. !afunction {#word}
  529. !args
  530. !libs
  531. !subs      {_MUsedChunkyShape,_MUsedChunkyShapeCheck,0}
  532. !name      {"MUsedShape"," ; Returns currently used Shape"}
  533.  
  534. !afunction {#word}
  535. !args
  536. !libs
  537. !subs      {_MUsedChunkyBitmap,_MUsedChunkyBitmapCheck,0}
  538. !name      {"MUsedBitmap"," ; Returns currently used Bitmap"}
  539.  
  540. !acommand  {#long}
  541. !args      {#word,#word,#word,#long}
  542. !libs
  543. !subs      {_MCludgeChunkyShape,_MCludgeChunkyShapeCheck,0}
  544. !name      {"MCludgeShape","ShapeNumber.w,Width.w,Height.w,Memory.l ; Cludge shape from existing mem"}
  545.  
  546. !acommand  {#long}
  547. !args      {#word,#word,#word,#long}
  548. !libs
  549. !subs      {_MCludgeChunkyBitmap,_MCludgeChunkyBitmapCheck,0}
  550. !name      {"MCludgeBitmap","BitmapNumber.w,Width.w,Height.w,Memory.l ; Cludge bitmap from existing mem"}
  551.  
  552. !astatement
  553. !args      {#byte}
  554. !libs
  555. !subs      {_MAutoUsec2pWindows,0,0}
  556. !name      {"MAutoUsec2pWindows","True/False ; Automatically `use' new c2pWindows. <>0=True"}
  557.  
  558. !astatement
  559. !args      {#byte}
  560. !libs
  561. !subs      {_MAutoUseChunkyShapes,0,0}
  562. !name      {"MAutoUseShapes","True/False ; Automatically `use' new shapes. <>0=True"}
  563.  
  564. !astatement
  565. !args      {#byte}
  566. !libs
  567. !subs      {_MAutoUseChunkyBitmaps,0,0}
  568. !name      {"MAutoUseBitmaps","True/False ; Automatically `use' new bitmaps. <>0=True"}
  569.  
  570. !astatement
  571. !args
  572. !libs
  573. !subs      {_MMakeChunkyShapeCookiesShort,_MMakeChunkyShapeCookiesShortCheck,0}
  574. !args      {#word,#word}
  575. !libs
  576. !subs      {_MMakeChunkyShapeCookies,_MMakeChunkyShapeCookiesCheck,0}
  577. !args      {#word}
  578. !libs
  579. !subs      {_MMakeChunkyShapeCookie,_MMakeChunkyShapeCookieCheck,0}
  580. !name      {"MMakeCookie","[FirstShape.w[,LastShape.w]] ; Make a cookie for a shape, range of shapes, or all shapes"}
  581.  
  582. !astatement
  583. !args
  584. !libs
  585. !subs      {_MMakeChunkyBitmapStencilsShort,_MMakeChunkyBitmapStencilsShortCheck,0}
  586. !args      {#word,#word}
  587. !libs
  588. !subs      {_MMakeChunkyBitmapStencils,_MMakeChunkyBitmapStencilsCheck,0}
  589. !args      {#word}
  590. !libs
  591. !subs      {_MMakeChunkyBitmapStencil,_MMakeChunkyBitmapStencilCheck,0}
  592. !name      {"MMakeStencil","[FirstBitmap.w[,LastBitmap.w]] ; Make a stencil for a bitmap, range of bitmaps, or all bitmaps"}
  593.  
  594. !astatement
  595. !args
  596. !libs
  597. !subs      {_MFreeChunkyShapeCookies,_MFreeChunkyShapeCookiesCheck,0}
  598. !args      {#word,#word}
  599. !libs
  600. !subs      {_MFreeChunkyShapeCookiesRange,_MFreeChunkyShapeCookiesRangeCheck,0}
  601. !args      {#word}
  602. !libs
  603. !subs      {_MFreeChunkyShapeCookie,_MFreeChunkyShapeCookieCheck,0}
  604. !name      {"MFreeCookie","[FirstShape.w[,LastShape.w]] ; Free a Shape's cookie, a range of Shape's cookies, or all cookies"}
  605.  
  606. !astatement
  607. !args
  608. !libs
  609. !subs      {_MFreeChunkyBitmapStencils,_MFreeChunkyBitmapStencilsCheck,0}
  610. !args      {#word,#word}
  611. !libs
  612. !subs      {_MFreeChunkyBitmapStencilsRange,_MFreeChunkyBitmapStencilsRangeCheck,0}
  613. !args      {#word}
  614. !libs
  615. !subs      {_MFreeChunkyBitmapStencil,_MFreeChunkyBitmapStencilCheck,0}
  616. !name      {"MFreeStencil","[FirstBitmap.w[,LastBitmap.w]] ; Free's a Bitmap's stencil, a range of stencils or all stencils"}
  617.  
  618. !astatement
  619. !args      {#byte}
  620. !libs
  621. !subs      {_MAutoChunkyShapeWrapping,0,0}
  622. !name      {"MAutoShapeWrap","On/Off ; Auto X&Y Handle-wrapping for Shapes"}
  623.  
  624. !astatement
  625. !args      {#byte}
  626. !libs
  627. !subs      {_MAutoChunkyBitmapWrapping,0,0}
  628. !name      {"MAutoBitmapWrap","On/Off ; Auto X&Y Handle-Wrapingp for Bitmaps"}
  629.  
  630. !astatement
  631. !args      {#word,#byte}
  632. !libs
  633. !subs      {_MChunkyShapeWrapping,_MChunkyShapeWrappingCheck,0}
  634. !name      {"MShapeWrap","ShapeNumber.w,On/Off ; De/Activate X&Y Handle-Wrap for Shape"}
  635.  
  636. !astatement
  637. !args      {#word,#byte}
  638. !libs
  639. !subs      {_MChunkyBitmapWrapping,_MChunkyBitmapWrappingCheck,0}
  640. !name      {"MBitmapWrap","BitmapNumber.w,On/Off ; De/Activate X&Y Handle-Wrap for Bitmap"}
  641.  
  642. !acommand  {#long}
  643. !args      {#word,#word}
  644. !libs
  645. !subs      {_MCludgeChunkyShapeStruct,_MCludgeChunkyShapeStructCheck,0}
  646. !name      {"MCludgeShapeStruct","[(]SourceShape.w,DestShape.w[)] ; Copy definition-data only"}
  647.  
  648. !acommand  {#long}
  649. !args      {#word,#word}
  650. !libs
  651. !subs      {_MCludgeChunkyBitmapStruct,_MCludgeChunkyBitmapStructCheck,0}
  652. !name      {"MCludgeBitmapStruct","[(]SourceBitmap.w,DestBitmap.w[)] ; Copy definition-data only"}
  653.  
  654. !astatement
  655. !args      {#word,#word}
  656. !libs
  657. !subs      {_MCopyc2pWindowStruct,_MCopyc2pWindowStructCheck,0}
  658. !name      {"MCopyc2pWindow","Sourcec2pWindow.w,Destc2pWindow.w ; Copy definition-data only"}
  659.  
  660. !acommand  {#long}
  661. !args      {#word,#word,#word,#word,#word,#word}
  662. !libs
  663. !subs      {_MChunkyShapeWindow,_MChunkyShapeWindowCheck,0}
  664. !name      {"MShapeWindow","[(]SourceShape.w,DestShape.w,X.w,Y.w,Width.w,Height.w[)] ; Cludge Shape within a Shape"}
  665.  
  666. !acommand  {#long}
  667. !args      {#word,#word,#word,#word,#word,#word}
  668. !libs
  669. !subs      {_MChunkyBitmapWindow,_MChunkyBitmapWindowCheck,0}
  670. !name      {"MBitmapWindow","[(]SourceBitmap.w,DestBitmap.w,X.w,Y.w,Width.w,Height.w[)] ; Cludge Bitmap within a Bitmap"}
  671.  
  672. !acommand  {#long}
  673. !args      {#word,#word}
  674. !libs
  675. !subs      {_MChunkyBitmapShape,_MChunkyBitmapShapeCheck,0}
  676. !name      {"MBitmapShape","[(]SourceBitmap.w,DestShape.w[)] ; Copy definition-data only"}
  677.  
  678. !acommand  {#long}
  679. !args      {#word,#word}
  680. !libs
  681. !subs      {_MChunkyShapesBitmap,_MChunkyShapesBitmapCheck,0}
  682. !name      {"MShapesBitmap","[(]SourceShape.w,DestBitmap.w[)] ; Copy definition-data only"}
  683.  
  684. !astatement
  685. !args      {#byte}
  686. !libs
  687. !subs      {_MAutoChunkyCookieXFlip,0,0}
  688. !name      {"MAutoCookieXFlip","On/Off ; Auto X-Flip for Shape's cookie"}
  689.  
  690. !astatement
  691. !args      {#byte}
  692. !libs
  693. !subs      {_MAutoChunkyCookieYFlip,0,0}
  694. !name      {"MAutoCookieYFlip","On/Off ; Auto Y-Flip for Shape's cookie"}
  695.  
  696. !astatement
  697. !args      {#byte}
  698. !libs
  699. !subs      {_MAutoChunkyStencilXFlip,0,0}
  700. !name      {"MAutoStencilXFlip","On/Off ; Auto X-Flip for Bitmap's stencil"}
  701.  
  702. !astatement
  703. !args      {#byte}
  704. !libs
  705. !subs      {_MAutoChunkyStencilYFlip,0,0}
  706. !name      {"MAutoStencilYFlip","On/Off ; Auto Y-Flip for Bitmap's stencil"}
  707.  
  708. !astatement
  709. !args      {#byte}
  710. !libs
  711. !subs      {_MAutoChunkyCookieFlipping,0,0}
  712. !name      {"MAutoCookieFlip","On/Off ; Auto X&Y Cookie-Flip for Shapes"}
  713.  
  714. !astatement
  715. !args      {#byte}
  716. !libs
  717. !subs      {_MAutoChunkyStencilFlipping,0,0}
  718. !name      {"MAutoStencilFlip","On/Off ; Auto X&Y Stencil-Flip for Bitmaps"}
  719.  
  720. !astatement
  721. !args      {#word}
  722. !libs
  723. !subs      {_MChunkyShapeXFlip,_MChunkyShapeXFlipCheck,0}
  724. !name      {"MShapeXFlip","ShapeNumber.w ; Horizontally flip a Shape (see MAutoCookieFlip)"}
  725.  
  726. !astatement
  727. !args      {#word}
  728. !libs
  729. !subs      {_MChunkyShapeYFlip,_MChunkyShapeYFlipCheck,0}
  730. !name      {"MShapeYFlip","ShapeNumber.w ; Vertically flip a Shape (see MAutoCookieFlip)"}
  731.  
  732. !astatement
  733. !args      {#word}
  734. !libs
  735. !subs      {_MChunkyBitmapXFlip,_MChunkyBitmapXFlipCheck,0}
  736. !name      {"MBitmapXFlip","BitmapNumber.w ; Horizontally flip a Bitmap (see MAutoStencilFlip)"}
  737.  
  738. !astatement
  739. !args      {#word}
  740. !libs
  741. !subs      {_MChunkyBitmapYFlip,_MChunkyBitmapYFlipCheck,0}
  742. !name      {"MBitmapYFlip","BitmapNumber.w ; Vertically flip a Bitmap (see MAutoStencilFlip)"}
  743.  
  744. !astatement
  745. !args      {#word}
  746. !libs
  747. !subs      {_MChunkyCookieXFlip,_MChunkyCookieXFlipCheck,0}
  748. !name      {"MCookieXFlip","ShapeNumber.w ; Horizontally flip a Shape's cookie"}
  749.  
  750. !astatement
  751. !args      {#word}
  752. !libs
  753. !subs      {_MChunkyCookieYFlip,_MChunkyCookieYFlipCheck,0}
  754. !name      {"MCookieYFlip","ShapeNumber.w ; Vertically flip a Shape's cookie"}
  755.  
  756. !astatement
  757. !args      {#word}
  758. !libs
  759. !subs      {_MChunkyStencilXFlip,_MChunkyStencilXFlipCheck,0}
  760. !name      {"MStencilXFlip","BitmapNumber.w ; Horizontally flip a Bitmap's stencil"}
  761.  
  762. !astatement
  763. !args      {#word}
  764. !libs
  765. !subs      {_MChunkyStencilYFlip,_MChunkyStencilYFlipCheck,0}
  766. !name      {"MStencilYFlip","BitmapNumber.w ; Vertically flip a Bitmap's stencil"}
  767.  
  768. !astatement
  769. !args      {#byte}
  770. !libs
  771. !subs      {_MAutoChunkyShapeClipping,0,0}
  772. !name      {"MAutoShapeClip","Status.b ; Auto-clip new Shapes. On/Off"}
  773.  
  774. !astatement
  775. !args      {#byte}
  776. !libs
  777. !subs      {_MAutoChunkyBitmapClipping,0,0}
  778. !name      {"MAutoBitmapClip","Status.b ; Auto-clip new Bitmaps. On/Off"}
  779.  
  780. !astatement
  781. !args      {#word,#byte}
  782. !libs
  783. !subs      {_MChunkyShapeClipSwitch,_MChunkyShapeClipSwitchCheck,0}
  784. !args      {#word,#word,#word,#word,#word}
  785. !libs
  786. !subs      {_MChunkyShapeClipShort,_MChunkyShapeClipShortCheck,0}
  787. !args      {#word,#word,#word,#word,#word,#byte}
  788. !libs
  789. !subs      {_MChunkyShapeClip,_MChunkyShapeClipCheck,0}
  790. !name      {"MShapeClip","ShapeNumber.w[,X.w,Y.w,Width.w,Height.w][,Active] ; Active=On/Off. Define Shape's clip window"}
  791.  
  792. !astatement
  793. !args      {#word,#byte}
  794. !libs
  795. !subs      {_MChunkyBitmapClipSwitch,_MChunkyBitmapClipSwitchCheck,0}
  796. !args      {#word,#word,#word,#word,#word}
  797. !libs
  798. !subs      {_MChunkyBitmapClipShort,_MChunkyBitmapClipShortCheck,0}
  799. !args      {#word,#word,#word,#word,#word,#byte}
  800. !libs
  801. !subs      {_MChunkyBitmapClip,_MChunkyBitmapClipCheck,0}
  802. !name      {"MBitmapClip","BitmapNumber.w[,X.w,Y.w,Width.w,Height.w][,Active] ; Active=On/Off. Define Bitmap's clip window"}
  803.  
  804. !acommand  {#long}
  805. !args      {#word,#word,#word,#word,#word}
  806. !libs
  807. !subs      {_MGetaChunkyShapeShort,_MGetaChunkyShapeShortCheck,0}
  808. !args      {#word,#word,#word,#word,#word,#byte,#byte}
  809. !libs
  810. !subs      {_MGetaChunkyShape,_MGetaChunkyShapeCheck,0}
  811. !name      {"MGetaShape","ShapeNumber.w,X.w,Y.w,Width.w,Height.w[,Block?,StencilIsCookie?] ; Grab shape from bitmap"}
  812.  
  813. !acommand  {#long}
  814. !args      {#word,#word,#word,#word,#word}
  815. !libs
  816. !subs      {_MGetaChunkyBitmapShort,_MGetaChunkyBitmapShortCheck,0}
  817. !args      {#word,#word,#word,#word,#word,#byte,#byte}
  818. !libs
  819. !subs      {_MGetaChunkyBitmap,_MGetaChunkyBitmapCheck,0}
  820. !name      {"MGetaBitmap","BitmapNumber.w,X.w,Y.w,Width.w,Height.w[,Block?,CookieIsStencil?] ; Grab bitmap from shape"}
  821.  
  822. !astatement
  823. !args      {#word,#word,#word,#word,#word,#word}
  824. !libs
  825. !subs      {_MScrollShort,_MScrollShortCheck,0}
  826. !args      {#word,#word,#word,#word,#word,#word,#word}
  827. !libs
  828. !subs      {_MScroll,_MScrollCheck,0}
  829. !args      {#word,#word,#word,#word,#word,#word,#word,#long}
  830. !libs
  831. !subs      {_MScrollCustom,_MScrollCustomCheck,0}
  832. !name      {"MScroll","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceBitmapNum.w[,CustomOffsets.l]] ; Copy graphic"}
  833.  
  834. !astatement
  835. !args      {#word,#word,#word,#word,#word,#word}
  836. !libs
  837. !subs      {_MScrollShapeShort,_MScrollShapeShortCheck,0}
  838. !args      {#word,#word,#word,#word,#word,#word,#word}
  839. !libs
  840. !subs      {_MScrollShape,_MScrollShapeCheck,0}
  841. !args      {#word,#word,#word,#word,#word,#word,#word,#long}
  842. !libs
  843. !subs      {_MScrollShapeCustom,_MScrollShapeCustomCheck,0}
  844. !name      {"MScrollShape","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceShapeNum.w[,CustomOffsets.l]] ; Copy graphic"}
  845.  
  846. !astatement
  847. !args      {#word,#word,#word,#word,#word,#word}
  848. !libs
  849. !subs      {_MScrollStencilShort,_MScrollStencilShortCheck,0}
  850. !args      {#word,#word,#word,#word,#word,#word,#word}
  851. !libs
  852. !subs      {_MScrollStencil,_MScrollStencilCheck,0}
  853. !args      {#word,#word,#word,#word,#word,#word,#word,#long}
  854. !libs
  855. !subs      {_MScrollStencilCustom,_MScrollStencilCustomCheck,0}
  856. !name      {"MScrollStencil","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceBitmapNum.w[,CustomOffsets.l]] ; Copy sten to sten"}
  857.  
  858. !astatement
  859. !args      {#word,#word,#word,#word,#word,#word}
  860. !libs
  861. !subs      {_MScrollCookieShort,_MScrollCookieShortCheck,0}
  862. !args      {#word,#word,#word,#word,#word,#word,#word}
  863. !libs
  864. !subs      {_MScrollCookie,_MScrollCookieCheck,0}
  865. !args      {#word,#word,#word,#word,#word,#word,#word,#long}
  866. !libs
  867. !subs      {_MScrollCookieCustom,_MScrollCookieCustomCheck,0}
  868. !name      {"MScrollCookie","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceShapeNum.w[,CustomOffsets.l]] ;Copy cook to cook"}
  869.  
  870. !astatement
  871. !args      {#word,#word,#word,#word,#word,#word}
  872. !libs
  873. !subs      {_MStencilScrollShort,_MStencilScrollShortCheck,0}
  874. !args      {#word,#word,#word,#word,#word,#word,#word}
  875. !libs
  876. !subs      {_MStencilScroll,_MStencilScrollCheck,0}
  877. !name      {"MMaskScroll","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceBitmapNum.w] ; Copy bitmap graphic with stencil-cut"}
  878.  
  879. !astatement
  880. !args      {#word,#word,#word,#word,#word,#word}
  881. !libs
  882. !subs      {_MCookieScrollShort,_MCookieScrollShortCheck,0}
  883. !args      {#word,#word,#word,#word,#word,#word,#word}
  884. !libs
  885. !subs      {_MCookieScroll,_MCookieScrollCheck,0}
  886. !name      {"MMaskScrollShape","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceShapeNum.w] ; Copy shape graphic with cookie-cut"}
  887.  
  888. !astatement
  889. !args      {#word,#word,#word,#word,#word,#word}
  890. !libs
  891. !subs      {_MStencilScrollStencilShort,_MStencilScrollStencilShortCheck,0}
  892. !args      {#word,#word,#word,#word,#word,#word,#word}
  893. !libs
  894. !subs      {_MStencilScrollStencil,_MStencilScrollStencilCheck,0}
  895. !name      {"MMaskScrollStencil","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceBitmapNum.w];Copy stencil2stencil & stencil-cut"}
  896.  
  897. !astatement
  898. !args      {#word,#word,#word,#word,#word,#word}
  899. !libs
  900. !subs      {_MCookieScrollCookieShort,_MCookieScrollCookieShortCheck,0}
  901. !args      {#word,#word,#word,#word,#word,#word,#word}
  902. !libs
  903. !subs      {_MCookieScrollCookie,_MCookieScrollCookieCheck,0}
  904. !name      {"MMaskScrollCookie","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceShapeNum.w] ; Copy cookie to cookie & cookie-cut"}
  905.  
  906. !astatement
  907. !args      {#word,#word,#word,#word,#word,#word}
  908. !libs
  909. !subs      {_MScrollBitmapToShapeShort,_MScrollBitmapToShapeShortCheck,0}
  910. !args      {#word,#word,#word,#word,#word,#word,#word}
  911. !libs
  912. !subs      {_MScrollBitmapToShape,_MScrollBitmapToShapeCheck,0}
  913. !args      {#word,#word,#word,#word,#word,#word,#word,#long}
  914. !libs
  915. !subs      {_MScrollBitmapToShapeCustom,_MScrollBitmapToShapeCustomCheck,0}
  916. !name      {"MScrollBitmapToShape","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceBitmapNum.w[,CustomOffsets.l]];bitmap 2 shape"}
  917.  
  918. !astatement
  919. !args      {#word,#word,#word,#word,#word,#word}
  920. !libs
  921. !subs      {_MScrollShapeToBitmapShort,_MScrollShapeToBitmapShortCheck,0}
  922. !args      {#word,#word,#word,#word,#word,#word,#word}
  923. !libs
  924. !subs      {_MScrollShapeToBitmap,_MScrollShapeToBitmapCheck,0}
  925. !args      {#word,#word,#word,#word,#word,#word,#word,#long}
  926. !libs
  927. !subs      {_MScrollShapeToBitmapCustom,_MScrollShapeToBitmapCustomCheck,0}
  928. !name      {"MScrollShapeToBitmap","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceShapeNum.w[,CustomOffsets.l]] ;shape 2 bitmap"}
  929.  
  930. !astatement
  931. !args      {#word,#word,#word,#word,#word,#word}
  932. !libs
  933. !subs      {_MScrollStencilToCookieShort,_MScrollStencilToCookieShortCheck,0}
  934. !args      {#word,#word,#word,#word,#word,#word,#word}
  935. !libs
  936. !subs      {_MScrollStencilToCookie,_MScrollStencilToCookieCheck,0}
  937. !args      {#word,#word,#word,#word,#word,#word,#word,#long}
  938. !libs
  939. !subs      {_MScrollStencilToCookieCustom,_MScrollStencilToCookieCustomCheck,0}
  940. !name      {"MScrollStencilToCookie","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceBitmapNum.w[,CustomOffsets.l]]; sten2cookie"}
  941.  
  942. !astatement
  943. !args      {#word,#word,#word,#word,#word,#word}
  944. !libs
  945. !subs      {_MScrollCookieToStencilShort,_MScrollCookieToStencilShortCheck,0}
  946. !args      {#word,#word,#word,#word,#word,#word,#word}
  947. !libs
  948. !subs      {_MScrollCookieToStencil,_MScrollCookieToStencilCheck,0}
  949. !args      {#word,#word,#word,#word,#word,#word,#word,#long}
  950. !libs
  951. !subs      {_MScrollCookieToStencilCustom,_MScrollCookieToStencilCustomCheck,0}
  952. !name      {"MScrollCookieToStencil","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceShapeNum.w[,CustomOffsets.l]] ; cookie2sten"}
  953.  
  954. !astatement
  955. !args      {#word,#word,#word,#word,#word,#word}
  956. !libs
  957. !subs      {_MStencilScrollBitmapToShapeShort,_MStencilScrollBitmapToShapeShortCheck,0}
  958. !args      {#word,#word,#word,#word,#word,#word,#word}
  959. !libs
  960. !subs      {_MStencilScrollBitmapToShape,_MStencilScrollBitmapToShapeCheck,0}
  961. !name      {"MMaskScrollBitmapToShape","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceBitmapNum.w] ; Copy bitmap to shape & cut"}
  962.  
  963. !astatement
  964. !args      {#word,#word,#word,#word,#word,#word}
  965. !libs
  966. !subs      {_MCookieScrollShapeToBitmapShort,_MCookieScrollShapeToBitmapShortCheck,0}
  967. !args      {#word,#word,#word,#word,#word,#word,#word}
  968. !libs
  969. !subs      {_MCookieScrollShapeToBitmap,_MCookieScrollShapeToBitmapCheck,0}
  970. !name      {"MMaskScrollShapeToBitmap","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceShapeNum.w] ; Copy shape to bitmap & cut"}
  971.  
  972. !astatement
  973. !args      {#word,#word,#word,#word,#word,#word}
  974. !libs
  975. !subs      {_MStencilScrollStencilToCookieShort,_MStencilScrollStencilToCookieShortCheck,0}
  976. !args      {#word,#word,#word,#word,#word,#word,#word}
  977. !libs
  978. !subs      {_MStencilScrollStencilToCookie,_MStencilScrollStencilToCookieCheck,0}
  979. !name      {"MMaskScrollStencilToCookie","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceBitmapNum.w] ;Copy stencil2cookie & cut"}
  980.  
  981. !astatement
  982. !args      {#word,#word,#word,#word,#word,#word}
  983. !libs
  984. !subs      {_MCookieScrollCookieToStencilShort,_MCookieScrollCookieToStencilShortCheck,0}
  985. !args      {#word,#word,#word,#word,#word,#word,#word}
  986. !libs
  987. !subs      {_MCookieScrollCookieToStencil,_MCookieScrollCookieToStencilCheck,0}
  988. !name      {"MMaskScrollCookieToStencil","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceShapeNum.w] ; Copy cookie2stencil & cut"}
  989.  
  990. !astatement
  991. !args      {#word,#word,#word,#word,#word,#word}
  992. !libs
  993. !subs      {_MBlockScrollShort,_MBlockScrollShortCheck,0}
  994. !args      {#word,#word,#word,#word,#word,#word,#word}
  995. !libs
  996. !subs      {_MBlockScroll,_MBlockScrollCheck,0}
  997. !name      {"MBlockScroll","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceBitmapNum.w] ; BlockCopy graphic"}
  998.  
  999. !astatement
  1000. !args      {#word,#word,#word,#word,#word,#word}
  1001. !libs
  1002. !subs      {_MBlockScrollShapeShort,_MBlockScrollShapeShortCheck,0}
  1003. !args      {#word,#word,#word,#word,#word,#word,#word}
  1004. !libs
  1005. !subs      {_MBlockScrollShape,_MBlockScrollShapeCheck,0}
  1006. !name      {"MBlockScrollShape","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceShapeNum.w] ; BlockCopy graphic"}
  1007.  
  1008. !astatement
  1009. !args      {#word,#word,#word,#word,#word,#word}
  1010. !libs
  1011. !subs      {_MBlockScrollStencilShort,_MBlockScrollStencilShortCheck,0}
  1012. !args      {#word,#word,#word,#word,#word,#word,#word}
  1013. !libs
  1014. !subs      {_MBlockScrollStencil,_MBlockScrollStencilCheck,0}
  1015. !name      {"MBlockScrollStencil","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceBitmapNum.w] ; BlockCopy stencil to stencil"}
  1016.  
  1017. !astatement
  1018. !args      {#word,#word,#word,#word,#word,#word}
  1019. !libs
  1020. !subs      {_MBlockScrollCookieShort,_MBlockScrollCookieShortCheck,0}
  1021. !args      {#word,#word,#word,#word,#word,#word,#word}
  1022. !libs
  1023. !subs      {_MBlockScrollCookie,_MBlockScrollCookieCheck,0}
  1024. !name      {"MBlockScrollCookie","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceShapeNum.w] ; BlockCopy cookie to cookie"}
  1025.  
  1026. !astatement
  1027. !args      {#word,#word,#word,#word,#word,#word}
  1028. !libs
  1029. !subs      {_MBlockScrollBitmapToShapeShort,_MBlockScrollBitmapToShapeShortCheck,0}
  1030. !args      {#word,#word,#word,#word,#word,#word,#word}
  1031. !libs
  1032. !subs      {_MBlockScrollBitmapToShape,_MBlockScrollBitmapToShapeCheck,0}
  1033. !name      {"MBlockScrollBitmapToShape","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceBitmapNum.w] ; BlockCopy bitmap to shape"}
  1034.  
  1035. !astatement
  1036. !args      {#word,#word,#word,#word,#word,#word}
  1037. !libs
  1038. !subs      {_MBlockScrollShapeToBitmapShort,_MBlockScrollShapeToBitmapShortCheck,0}
  1039. !args      {#word,#word,#word,#word,#word,#word,#word}
  1040. !libs
  1041. !subs      {_MBlockScrollShapeToBitmap,_MBlockScrollShapeToBitmapCheck,0}
  1042. !name      {"MBlockScrollShapeToBitmap","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceShapeNum.w] ; BlockCopy shape to bitmap"}
  1043.  
  1044. !astatement
  1045. !args      {#word,#word,#word,#word,#word,#word}
  1046. !libs
  1047. !subs      {_MBlockScrollStencilToCookieShort,_MBlockScrollStencilToCookieShortCheck,0}
  1048. !args      {#word,#word,#word,#word,#word,#word,#word}
  1049. !libs
  1050. !subs      {_MBlockScrollStencilToCookie,_MBlockScrollStencilToCookieCheck,0}
  1051. !name      {"MBlockScrollStencilToCookie","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceBitmapNum.w];BlockCopy stencil2cookie"}
  1052.  
  1053. !astatement
  1054. !args      {#word,#word,#word,#word,#word,#word}
  1055. !libs
  1056. !subs      {_MBlockScrollCookieToStencilShort,_MBlockScrollCookieToStencilShortCheck,0}
  1057. !args      {#word,#word,#word,#word,#word,#word,#word}
  1058. !libs
  1059. !subs      {_MBlockScrollCookieToStencil,_MBlockScrollCookieToStencilCheck,0}
  1060. !name      {"MBlockScrollCookieToStencil","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceShapeNum.w] ; BlockCopy cookie2stencil"}
  1061.  
  1062. !astatement
  1063. !args      {#byte}
  1064. !libs
  1065. !subs      {_MCPU,_MCPUCheck,0}
  1066. !name      {"MCPU","Processor.b ; Set cpu routines allowed to use. CAREFUL!! Try using `MProcessor' or `Processor'"}
  1067.  
  1068. !astatement
  1069. !args
  1070. !libs
  1071. !subs      {_MClsShort,_MClsShortCheck,0}
  1072. !args      {#byte}
  1073. !libs
  1074. !subs      {_MCls,_MClsCheck,0}
  1075. !name      {"MCls","[Colour] Clear a bitmap to colour 0 or the specified colour (in DrawingMode)"}
  1076.  
  1077. !astatement
  1078. !args
  1079. !libs
  1080. !subs      {_MClsShapeShort,_MClsShapeShortCheck,0}
  1081. !args      {#byte}
  1082. !libs
  1083. !subs      {_MClsShape,_MClsShapeCheck,0}
  1084. !name      {"MClsShape","[Colour] Clear a shape to colour 0 or the specified colour (in DrawingMode)"}
  1085.  
  1086. !astatement
  1087. !args
  1088. !libs
  1089. !subs      {_MClsStencilShort,_MClsStencilShortCheck,0}
  1090. !args      {#byte}
  1091. !libs
  1092. !subs      {_MClsStencil,_MClsStencilCheck,0}
  1093. !name      {"MClsStencil","[Colour] Clear a stencil to colour 0 or the specified colour (in DrawingMode)"}
  1094.  
  1095. !astatement
  1096. !args
  1097. !libs
  1098. !subs      {_MClsCookieShort,_MClsCookieShortCheck,0}
  1099. !args      {#byte}
  1100. !libs
  1101. !subs      {_MClsCookie,_MClsCookieCheck,0}
  1102. !name      {"MClsCookie","[Colour] Clear a cookie to colour 0 or the specified colour (in DrawingMode)"}
  1103.  
  1104. !astatement
  1105. !args      {#word,#word}
  1106. !libs
  1107. !subs      {_MPlotShort,_MPlotShortCheck,0}
  1108. !args      {#word,#word,#byte}
  1109. !libs
  1110. !subs      {_MPlot,_MPlotCheck,0}
  1111. !name      {"MPlot","Xpos.w,Ypos.w[,Colour] ; Plot a single pixel in the bitmap in DrawingMode "}
  1112.  
  1113. !astatement
  1114. !args      {#word,#word}
  1115. !libs
  1116. !subs      {_MPlotShapeShort,_MPlotShapeShortCheck,0}
  1117. !args      {#word,#word,#byte}
  1118. !libs
  1119. !subs      {_MPlotShape,_MPlotShapeCheck,0}
  1120. !name      {"MPlotShape","Xpos.w,Ypos.w[,Colour] ; Plot a single pixel in the shape in DrawingMode"}
  1121.  
  1122. !astatement
  1123. !args      {#word,#word}
  1124. !libs
  1125. !subs      {_MPlotStencilShort,_MPlotStencilShortCheck,0}
  1126. !args      {#word,#word,#byte}
  1127. !libs
  1128. !subs      {_MPlotStencil,_MPlotStencilCheck,0}
  1129. !name      {"MPlotStencil","Xpos.w,Ypos.w[,Colour] ;Plot a single pixel in the stencil to *represent* DrawingMode"}
  1130.  
  1131. !astatement
  1132. !args      {#word,#word}
  1133. !libs
  1134. !subs      {_MPlotCookieShort,_MPlotCookieShortCheck,0}
  1135. !args      {#word,#word,#byte}
  1136. !libs
  1137. !subs      {_MPlotCookie,_MPlotCookieCheck,0}
  1138. !name      {"MPlotCookie","Xpos.w,Ypos.w[,Colour] ; Plot a single pixel in the cookie to *represent* DrawingMode"}
  1139.  
  1140. !afunction {#byte}
  1141. !args      {#word,#word}
  1142. !libs
  1143. !subs      {_MPointShort,_MPointShortCheck,0}
  1144. !args      {#word,#word,#word}
  1145. !libs
  1146. !subs      {_MPoint,_MPointCheck,0}
  1147. !name      {"MPoint","(Xpos.w,Ypos.w[,BitmapToRead.w]) ; Return the colour of a single pixel in a bitmap"}
  1148.  
  1149. !afunction {#byte}
  1150. !args      {#word,#word}
  1151. !libs
  1152. !subs      {_MPointShapeShort,_MPointShapeShortCheck,0}
  1153. !args      {#word,#word,#word}
  1154. !libs
  1155. !subs      {_MPointShape,_MPointShapeCheck,0}
  1156. !name      {"MPointShape","(Xpos.w,Ypos.w[,ShapeToRead.w]) ; Return the colour of a single pixel in a shape"}
  1157.  
  1158. !afunction {#byte}
  1159. !args      {#word,#word}
  1160. !libs
  1161. !subs      {_MPointStencilShort,_MPointStencilShortCheck,0}
  1162. !args      {#word,#word,#word}
  1163. !libs
  1164. !subs      {_MPointStencil,_MPointStencilCheck,0}
  1165. !name      {"MPointStencil","(Xpos.w,Ypos.w[,BitmapToRead.w]) ;Return the status of a pixel in stencil. -1=Data, 0=Background"}
  1166.  
  1167. !afunction {#byte}
  1168. !args      {#word,#word}
  1169. !libs
  1170. !subs      {_MPointCookieShort,_MPointCookieShortCheck,0}
  1171. !args      {#word,#word,#word}
  1172. !libs
  1173. !subs      {_MPointCookie,_MPointCookieCheck,0}
  1174. !name      {"MPointCookie","(Xpos.w,Ypos.w[,ShapeToRead.w]) ; Return the status of a pixel in cookie. -1=Data, 0=Background"}
  1175.  
  1176. !astatement
  1177. !args      {#word,#word,#word,#word,#word,#word}
  1178. !libs
  1179. !subs      {_MDoubleScrollShort,_MDoubleScrollShortCheck,0}
  1180. !args      {#word,#word,#word,#word,#word,#word,#word}
  1181. !libs
  1182. !subs      {_MDoubleScroll,_MDoubleScrollCheck,0}
  1183. !args      {#word,#word,#word,#word,#word,#word,#word,#long}
  1184. !libs
  1185. !subs      {_MDoubleScrollCustom,_MDoubleScrollCustomCheck,0}
  1186. !name      {"MSScroll","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceBitmapNum.w[,CustomOffsets.l]] ; Copy bm 2 bm and st 2 st"}
  1187.  
  1188. !astatement
  1189. !args      {#word,#word,#word,#word,#word,#word}
  1190. !libs
  1191. !subs      {_MDoubleScrollShapeShort,_MDoubleScrollShapeShortCheck,0}
  1192. !args      {#word,#word,#word,#word,#word,#word,#word}
  1193. !libs
  1194. !subs      {_MDoubleScrollShape,_MDoubleScrollShapeCheck,0}
  1195. !args      {#word,#word,#word,#word,#word,#word,#word,#long}
  1196. !libs
  1197. !subs      {_MDoubleScrollShapeCustom,_MDoubleScrollShapeCustomCheck,0}
  1198. !name      {"MSScrollShape","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceShapeNum.w[,CustomOffsets.l]] ; Copy sh2sh and ck2ck"}
  1199.  
  1200. !astatement
  1201. !args      {#word,#word,#word,#word,#word,#word}
  1202. !libs
  1203. !subs      {_MDoubleScrollBitmapToShapeShort,_MDoubleScrollBitmapToShapeShortCheck,0}
  1204. !args      {#word,#word,#word,#word,#word,#word,#word}
  1205. !libs
  1206. !subs      {_MDoubleScrollBitmapToShape,_MDoubleScrollBitmapToShapeCheck,0}
  1207. !args      {#word,#word,#word,#word,#word,#word,#word,#long}
  1208. !libs
  1209. !subs      {_MDoubleScrollBitmapToShapeCustom,_MDoubleScrollBitmapToShapeCustomCheck,0}
  1210. !name      {"MSScrollBitmapToShape","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceBitmapNum.w[,CustomOffsets.l]];bm2shandst2ck"}
  1211.  
  1212. !astatement
  1213. !args      {#word,#word,#word,#word,#word,#word}
  1214. !libs
  1215. !subs      {_MDoubleScrollShapeToBitmapShort,_MDoubleScrollShapeToBitmapShortCheck,0}
  1216. !args      {#word,#word,#word,#word,#word,#word,#word}
  1217. !libs
  1218. !subs      {_MDoubleScrollShapeToBitmap,_MDoubleScrollShapeToBitmapCheck,0}
  1219. !args      {#word,#word,#word,#word,#word,#word,#word,#long}
  1220. !libs
  1221. !subs      {_MDoubleScrollShapeToBitmapCustom,_MDoubleScrollShapeToBitmapCustomCheck,0}
  1222. !name      {"MSScrollShapeToBitmap","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceShapeNum.w[,CustomOffsets.l]]; sh2bmandck2st"}
  1223.  
  1224. !astatement
  1225. !args      {#word,#word,#word,#word,#word,#word}
  1226. !libs
  1227. !subs      {_MDoubleStencilScrollShort,_MDoubleStencilScrollShortCheck,0}
  1228. !args      {#word,#word,#word,#word,#word,#word,#word}
  1229. !libs
  1230. !subs      {_MDoubleStencilScroll,_MDoubleStencilScrollCheck,0}
  1231. !name      {"MSMaskScroll","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceBitmapNum.w] ; Stencil-Copy bm 2 bm and st 2 st"}
  1232.  
  1233. !astatement
  1234. !args      {#word,#word,#word,#word,#word,#word}
  1235. !libs
  1236. !subs      {_MDoubleCookieScrollShort,_MDoubleCookieScrollShortCheck,0}
  1237. !args      {#word,#word,#word,#word,#word,#word,#word}
  1238. !libs
  1239. !subs      {_MDoubleCookieScroll,_MDoubleCookieScrollCheck,0}
  1240. !name      {"MSMaskScrollShape","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceShapeNum.w] ; Cookie-Copy sh2sh and ck2ck"}
  1241.  
  1242. !astatement
  1243. !args      {#word,#word,#word,#word,#word,#word}
  1244. !libs
  1245. !subs      {_MDoubleStencilScrollBitmapToShapeShort,_MDoubleStencilScrollBitmapToShapeShortCheck,0}
  1246. !args      {#word,#word,#word,#word,#word,#word,#word}
  1247. !libs
  1248. !subs      {_MDoubleStencilScrollBitmapToShape,_MDoubleStencilScrollBitmapToShapeCheck,0}
  1249. !name      {"MSMaskScrollBitmapToShape","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceBitmapNum.w] ;Sten-Copy bm2sh&st2ck"}
  1250.  
  1251. !astatement
  1252. !args      {#word,#word,#word,#word,#word,#word}
  1253. !libs
  1254. !subs      {_MDoubleCookieScrollShapeToBitmapShort,_MDoubleCookieScrollShapeToBitmapShortCheck,0}
  1255. !args      {#word,#word,#word,#word,#word,#word,#word}
  1256. !libs
  1257. !subs      {_MDoubleCookieScrollShapeToBitmap,_MDoubleCookieScrollShapeToBitmapCheck,0}
  1258. !name      {"MSMaskScrollShapeToBitmap","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceShapeNum.w] ; Cook-Copy sh2bm&ck2st"}
  1259.  
  1260. !astatement
  1261. !args      {#word,#word,#word,#word,#word,#word}
  1262. !libs
  1263. !subs      {_MDoubleBlockScrollShort,_MDoubleBlockScrollShortCheck,0}
  1264. !args      {#word,#word,#word,#word,#word,#word,#word}
  1265. !libs
  1266. !subs      {_MDoubleBlockScroll,_MDoubleBlockScrollCheck,0}
  1267. !name      {"MSBlockScroll","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceBitmapNum.w] ; Block-Copy bm 2 bm and st 2 st"}
  1268.  
  1269. !astatement
  1270. !args      {#word,#word,#word,#word,#word,#word}
  1271. !libs
  1272. !subs      {_MDoubleBlockScrollShapeShort,_MDoubleBlockScrollShapeShortCheck,0}
  1273. !args      {#word,#word,#word,#word,#word,#word,#word}
  1274. !libs
  1275. !subs      {_MDoubleBlockScrollShape,_MDoubleBlockScrollShapeCheck,0}
  1276. !name      {"MSBlockScrollShape","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceShapeNum.w] ; Block-Copy sh2sh and ck2ck"}
  1277.  
  1278. !astatement
  1279. !args      {#word,#word,#word,#word,#word,#word}
  1280. !libs
  1281. !subs      {_MDoubleBlockScrollBitmapToShapeShort,_MDoubleBlockScrollBitmapToShapeShortCheck,0}
  1282. !args      {#word,#word,#word,#word,#word,#word,#word}
  1283. !libs
  1284. !subs      {_MDoubleBlockScrollBitmapToShape,_MDoubleBlockScrollBitmapToShapeCheck,0}
  1285. !name      {"MSBlockScrollBitmapToShape","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceBitmapNum.w];BlockCopy bm2sh&st2ck"}
  1286.  
  1287. !astatement
  1288. !args      {#word,#word,#word,#word,#word,#word}
  1289. !libs
  1290. !subs      {_MDoubleBlockScrollShapeToBitmapShort,_MDoubleBlockScrollShapeToBitmapShortCheck,0}
  1291. !args      {#word,#word,#word,#word,#word,#word,#word}
  1292. !libs
  1293. !subs      {_MDoubleBlockScrollShapeToBitmap,_MDoubleBlockScrollShapeToBitmapCheck,0}
  1294. !name      {"MSBlockScrollShapeToBitmap","X1.w,Y1.w,Width.w,Height.w,X2.w,Y2.w[,SourceShapeNum.w];BlockCopy sh2bm&ck2st"}
  1295.  
  1296. !astatement
  1297. !args      {#byte}
  1298. !libs
  1299. !subs      {_MDoubleScrollCut,0,0}
  1300. !name      {"MSScrollCut","On/Off ; 0=Paste stencil/cookie, <>0=Cut using stencil/cookie"}
  1301.  
  1302. !astatement
  1303. !args      {#word}
  1304. !libs
  1305. !subs      {_MUseChunkyShapeBank,_MUseChunkyShapeBankCheck,0}
  1306. !name      {"MUseShapeBank","BankNumber.w ; Current shape bank, 0..31"}
  1307.  
  1308. !astatement
  1309. !args
  1310. !libs
  1311. !subs      {_MNothing,0,0}
  1312. !name      {"MNothing","; This is the 128th token and it doesn't work so is a dummy"}
  1313.  
  1314. !acommand  {#word}
  1315. !args
  1316. !libs
  1317. !subs      {_MSScrollModeShort,0,0}
  1318. !args      {#word}
  1319. !libs
  1320. !subs      {_MSScrollMode,_MSScrollModeCheck,0}
  1321. !name {"MMaskScrollMode","[([]Mode.w[])];CookieMode/EraseMode/InvMode/SolidMode/MColourMode/MReMapMode/MSimpleReMapMode/MAddMo"}
  1322.  
  1323. !acommand  {#word}
  1324. !args
  1325. !libs
  1326. !subs      {_MBlitModeShort,0,0}
  1327. !args      {#word}
  1328. !libs
  1329. !subs      {_MBlitMode,_MBlitModeCheck,0}
  1330. !name  {"MBlitMode","[([]Mode.w[])] ; CookieMode/EraseMode/InvMode/SolidMode/MColourMode/MReMapMode/MSimpleReMapMode/MAddMode"}
  1331.  
  1332. !astatement
  1333. !args      {#word,#word}
  1334. !libs
  1335. !subs      {_MBlitShort,_MBlitShortCheck,0}
  1336. !args      {#word,#word,#word}
  1337. !libs
  1338. !subs      {_MBlit,_MBlitCheck,0}
  1339. !name      {"MBlit","[ShapeNumber.w,]Xpos.w,Ypos,w ; Blit shape to bitmap, any coords"}
  1340.  
  1341. !astatement
  1342. !args      {#word,#word}
  1343. !libs
  1344. !subs      {_MBlockShort,_MBlockShortCheck,0}
  1345. !args      {#word,#word,#word}
  1346. !libs
  1347. !subs      {_MBlock,_MBlockCheck,0}
  1348. !name      {"MBlock","[ShapeNumber.w,]Xpos.w,Ypos.w ; Block-blit shape to bitmap, align Xpos and width in multiples of 16!"}
  1349.  
  1350. !astatement
  1351. !args      {#word,#word}
  1352. !libs
  1353. !subs      {_MTile16x16Short,_MTile16x16ShortCheck,0}
  1354. !args      {#word,#word,#word}
  1355. !libs
  1356. !subs      {_MTile16x16,_MTile16x16Check,0}
  1357. !name      {"MTile16x16","[ShapeNumber.w,]Xpos.w,Ypos.w ; Block-blit 16x16 shape to bitmap, size must be 16x16, align x/y"}
  1358.  
  1359. !astatement
  1360. !args      {#word,#word}
  1361. !libs
  1362. !subs      {_MTile32x32Short,_MTile32x32ShortCheck,0}
  1363. !args      {#word,#word,#word}
  1364. !libs
  1365. !subs      {_MTile32x32,_MTile32x32Check,0}
  1366. !name      {"MTile32x32","[ShapeNumber.w,]Xpos.w,Ypos.w ; Block-blit 32x32 shape to bitmap, size must be 32x32, align x/y"}
  1367.  
  1368. !astatement
  1369. !args      {#word,#word}
  1370. !libs
  1371. !subs      {_MDoubleTile16x16Short,_MDoubleTile16x16ShortCheck,0}
  1372. !args      {#word,#word,#word}
  1373. !libs
  1374. !subs      {_MDoubleTile16x16,_MDoubleTile16x16Check,0}
  1375. !name      {"MSTile16x16","[ShapeNumber.w,]Xpos.w,Ypos.w ; Block-blit 16x16 shape&cook 2 bitmap, size 16x16, align x/y"}
  1376.  
  1377. !astatement
  1378. !args      {#word,#word}
  1379. !libs
  1380. !subs      {_MDoubleTile32x32Short,_MDoubleTile32x32ShortCheck,0}
  1381. !args      {#word,#word,#word}
  1382. !libs
  1383. !subs      {_MDoubleTile32x32,_MDoubleTile32x32Check,0}
  1384. !name      {"MSTile32x32","[ShapeNumber.w,]Xpos.w,Ypos.w ; Block-blit 32x32 shape&cook 2 bitmap, size 32x32, align x/y"}
  1385.  
  1386. !astatement
  1387. !args      {#word,#word}
  1388. !libs
  1389. !subs      {_MTripleTile16x16Short,_MTripleTile16x16ShortCheck,0}
  1390. !args      {#word,#word,#word}
  1391. !libs
  1392. !subs      {_MTripleTile16x16,_MTripleTile16x16Check,0}
  1393. !name      {"MSTile16x16Store","[ShapeNumber.w,]Xpos.w,Ypos.w ; Block-blit 16x16 shape&cook 2 bitmaps, size 16x16, align x/y"}
  1394.  
  1395. !astatement
  1396. !args      {#word,#word}
  1397. !libs
  1398. !subs      {_MTripleTile32x32Short,_MTripleTile32x32ShortCheck,0}
  1399. !args      {#word,#word,#word}
  1400. !libs
  1401. !subs      {_MTripleTile32x32,_MTripleTile32x32Check,0}
  1402. !name      {"MSTile32x32Store","[ShapeNumber.w,]Xpos.w,Ypos.w ; Block-blit 32x32 shape&cook 2 bitmaps, size 32x32, align x/y"}
  1403.  
  1404. !astatement
  1405. !args      {#word,#word}
  1406. !libs
  1407. !subs      {_MTile16x16TwiceShort,_MTile16x16TwiceShortCheck,0}
  1408. !args      {#word,#word,#word}
  1409. !libs
  1410. !subs      {_MTile16x16Twice,_MTile16x16TwiceCheck,0}
  1411. !name      {"MTile16x16Store","[ShapeNumber.w,]Xpos.w,Ypos.w ; Block-blit 16x16 shape to 2 bitmaps, size 16x16, align x/y"}
  1412.  
  1413. !astatement
  1414. !args      {#word,#word}
  1415. !libs
  1416. !subs      {_MTile32x32TwiceShort,_MTile32x32TwiceShortCheck,0}
  1417. !args      {#word,#word,#word}
  1418. !libs
  1419. !subs      {_MTile32x32Twice,_MTile32x32TwiceCheck,0}
  1420. !name      {"MTile32x32Store","[ShapeNumber.w,]Xpos.w,Ypos.w ; Block-blit 32x32 shape to 2 bitmaps, size 32x32, align x/y"}
  1421.  
  1422. !acommand  {#long}
  1423. !args      {#word}
  1424. !libs
  1425. !subs      {_MReserveChunkyQueues,_MReserveChunkyQueuesCheck,0}
  1426. !name      {"MReserveQueues","[(]NumberOfQueues.w[)] ; Reserve structure-memory for Queues"}
  1427.  
  1428. !astatement
  1429. !args      {#word,#word}
  1430. !libs
  1431. !subs      {_MFreeChunkyQueuesRange,_MFreeChunkyQueuesRangeCheck,0}
  1432. !args
  1433. !libs
  1434. !subs      {_MFreeChunkyQueues,_MFreeChunkyQueuesCheck,0}
  1435. !args      {#word}
  1436. !libs
  1437. !subs      {_MFreeChunkyQueue,_MFreeChunkyQueueCheck,0}
  1438. !name      {"MFreeQueue","[FirstQueue.w[,LastQueue.w]] ; Free a Queue, a range of queues, or all queues"}
  1439.  
  1440. !afunction {#long}
  1441. !args
  1442. !libs
  1443. !subs      {_MAddrChunkyQueueShort,_MAddrChunkyQueueShortCheck,0}
  1444. !args      {#word}
  1445. !libs
  1446. !subs      {_MAddrChunkyQueue,_MAddrChunkyQueueCheck,0}
  1447. !name      {"MAddrQueue","[(QueueNumber.w)] ; Returns address of Queue structure"}
  1448.  
  1449. !acommand  {#long}
  1450. !args      {#word,#word}
  1451. !libs
  1452. !subs      {_MChunkyQueue,_MChunkyQueueCheck,0}
  1453. !name      {"MQueue","[(]QueueNumber.w,NumberOfItems.w[)] ; Allocmem for Queue list items"}
  1454.  
  1455. !astatement
  1456. !args      {#word}
  1457. !libs
  1458. !subs      {_MFlushChunkyQueue,_MFlushChunkyQueueCheck,0}
  1459. !name      {"MFlushQueue","QueueNumber.w ; Empties the queue to contain no items"}
  1460.  
  1461. !acommand  {#word}
  1462. !args
  1463. !libs
  1464. !subs      {_MQBlitModeShort,0,0}
  1465. !args      {#word}
  1466. !libs
  1467. !subs      {_MQBlitMode,_MQBlitModeCheck,0}
  1468. !name {"MQBlitMode","[([]Mode.w[])] ; CookieMode/EraseMode/InvMode/SolidMode/MColourMode/MReMapMode/MSimpleReMapMode/MAddMode"}
  1469.  
  1470. !astatement
  1471. !args      {#byte}
  1472. !libs
  1473. !subs      {_MAutoUseChunkyQueues,0,0}
  1474. !name      {"MAutoUseQueues","True/False ; Automatically `use' new Queues. <>0=True"}
  1475.  
  1476. !astatement
  1477. !args      {#word}
  1478. !libs
  1479. !subs      {_MUseChunkyQueueShortest,_MUseChunkyQueueShortestCheck,0}
  1480. !args      {#word,#word}
  1481. !libs
  1482. !subs      {_MUseChunkyQueueShort,_MUseChunkyQueueShortCheck,0}
  1483. !args      {#word,#word,#word}
  1484. !libs
  1485. !subs      {_MUseChunkyQueue,_MUseChunkyQueueCheck,0}
  1486. !name      {"MUseQueue","MainQueueNum.w[,SecondQueueNum.w[,ThirdQueueNum.w]] ; Current queue(s) to use"}
  1487.  
  1488. !afunction {#word}
  1489. !args
  1490. !libs
  1491. !subs      {_MUsedChunkyQueue,_MUsedChunkyQueueCheck,0}
  1492. !name      {"MUsedQueue"," ; Returns currently used Queue"}
  1493.  
  1494. !astatement
  1495. !args      {#word,#word}
  1496. !libs
  1497. !subs      {_MQBlitShortest,_MQBlitShortestCheck,0}
  1498. !args      {#word,#word,#word}
  1499. !libs
  1500. !subs      {_MQBlitShort,_MQBlitShortCheck,0}
  1501. !args      {#word,#word,#word,#word}
  1502. !libs
  1503. !subs      {_MQBlit,_MQBlitCheck,0}
  1504. !name      {"MQBlit","[[Queue.w,]ShapeNumber.w,]Xpos.w,Ypos,w ; QBlit shape to bitmap, any coords"}
  1505.  
  1506. !astatement
  1507. !args      {#word,#word}
  1508. !libs
  1509. !subs      {_MQBlockShortest,_MQBlockShortestCheck,0}
  1510. !args      {#word,#word,#word}
  1511. !libs
  1512. !subs      {_MQBlockShort,_MQBlockShortCheck,0}
  1513. !args      {#word,#word,#word,#word}
  1514. !libs
  1515. !subs      {_MQBlock,_MQBlockCheck,0}
  1516. !name      {"MQBlock","[[Queue.w,]ShapeNumber.w,]Xpos.w,Ypos.w ; QBlock-blit shape 2 bitmap, align Xpos & width in mult of 16"}
  1517.  
  1518. !astatement
  1519. !args      {#word}
  1520. !libs
  1521. !subs      {_MUnQueueShort,_MUnQueueShortCheck,0}
  1522. !args      {#word,#word}
  1523. !libs
  1524. !subs      {_MUnQueue,_MUnQueueCheck,0}
  1525. !args      {#word,#word,#word}
  1526. !libs
  1527. !subs      {_MUnQueueRangeShort,_MUnQueueRangeShortCheck,0}
  1528. !args      {#word,#word,#word,#word}
  1529. !libs
  1530. !subs      {_MUnQueueRange,_MUnQueueRangeCheck,0}
  1531. !name      {"MUnQueue","QueueNumber.w[,FirstItem.w,LastItem.w][,BitmapNumber.w] ; UnQueue [range of] queued objects [&flush]"}
  1532.  
  1533. !afunction {#long}
  1534. !args
  1535. !libs
  1536. !subs      {_MBitmapPtrAssume,_MBitmapPtrAssumeCheck,0}
  1537. !args      {#word}
  1538. !libs
  1539. !subs      {_MBitmapPtrShortest,_MBitmapPtrShortestCheck,0}
  1540. !args      {#word,#word}
  1541. !libs
  1542. !subs      {_MBitmapPtrShort,_MBitmapPtrShortCheck,0}
  1543. !args      {#word,#word,#word}
  1544. !libs
  1545. !subs      {_MBitmapPtr,_MBitmapPtrCheck,0}
  1546. !name      {"MBitmapPtr","[Xpos.w,Ypos.w][,BitmapNumber.w] ; Return data address calculated using bitmap [and coords]"}
  1547.  
  1548. !afunction {#long}
  1549. !args
  1550. !libs
  1551. !subs      {_MShapePtrAssume,_MShapePtrAssumeCheck,0}
  1552. !args      {#word}
  1553. !libs
  1554. !subs      {_MShapePtrShortest,_MShapePtrShortestCheck,0}
  1555. !args      {#word,#word}
  1556. !libs
  1557. !subs      {_MShapePtrShort,_MShapePtrShortCheck,0}
  1558. !args      {#word,#word,#word}
  1559. !libs
  1560. !subs      {_MShapePtr,_MShapePtrCheck,0}
  1561. !name      {"MShapePtr","[Xpos.w,Ypos.w][,ShapeNumber.w] ; Return data address calculated using shape [and coords]"}
  1562.  
  1563. !afunction {#long}
  1564. !args
  1565. !libs
  1566. !subs      {_MStencilPtrAssume,_MStencilPtrAssumeCheck,0}
  1567. !args      {#word}
  1568. !libs
  1569. !subs      {_MStencilPtrShortest,_MStencilPtrShortestCheck,0}
  1570. !args      {#word,#word}
  1571. !libs
  1572. !subs      {_MStencilPtrShort,_MStencilPtrShortCheck,0}
  1573. !args      {#word,#word,#word}
  1574. !libs
  1575. !subs      {_MStencilPtr,_MStencilPtrCheck,0}
  1576. !name      {"MStencilPtr","[Xpos.w,Ypos.w][,BitmapNumber.w] ; Return address calculated using stencil [and coords]"}
  1577.  
  1578. !afunction {#long}
  1579. !args
  1580. !libs
  1581. !subs      {_MCookiePtrAssume,_MCookiePtrAssumeCheck,0}
  1582. !args      {#word}
  1583. !libs
  1584. !subs      {_MCookiePtrShortest,_MCookiePtrShortestCheck,0}
  1585. !args      {#word,#word}
  1586. !libs
  1587. !subs      {_MCookiePtrShort,_MCookiePtrShortCheck,0}
  1588. !args      {#word,#word,#word}
  1589. !libs
  1590. !subs      {_MCookiePtr,_MCookiePtrCheck,0}
  1591. !name      {"MCookiePtr","[Xpos.w,Ypos.w][,ShapeNumber.w] ; Return address calculated using cookie [and coords]"}
  1592.  
  1593. !astatement
  1594. !args      {#word,#word,#word,#word}
  1595. !libs
  1596. !subs      {_MQDummyShort,_MQDummyShortCheck,0}
  1597. !args      {#word,#word,#word,#word,#word}
  1598. !libs
  1599. !subs      {_MQDummy,_MQDummyCheck,0}
  1600. !name      {"MQDummy","[Queue.w,]Xpos.w,Ypos.w,Width.w,Height.w ; Add an item to a queue without having to do a blit"}
  1601.  
  1602. !acommand  {#word}
  1603. !args
  1604. !libs
  1605. !subs      {_MDoubleBlitModeShort,0,0}
  1606. !args      {#word}
  1607. !libs
  1608. !subs      {_MDoubleBlitMode,_MDoubleBlitModeCheck,0}
  1609. !name {"MSBlitMode","[([]Mode.w[])] ; CookieMode/EraseMode/InvMode/SolidMode/MColourMode/MReMapMode/MSimpleReMapMode/MAddMode"}
  1610.  
  1611. !astatement
  1612. !args      {#word,#word}
  1613. !libs
  1614. !subs      {_MDoubleBlitShort,_MDoubleBlitShortCheck,0}
  1615. !args      {#word,#word,#word}
  1616. !libs
  1617. !subs      {_MDoubleBlit,_MDoubleBlitCheck,0}
  1618. !name      {"MSBlit","[ShapeNumber.w,]Xpos.w,Ypos,w ; Blit shape to bitmap and cookie to stencil, any coords"}
  1619.  
  1620. !astatement
  1621. !args      {#word,#word}
  1622. !libs
  1623. !subs      {_MDoubleBlockShort,_MDoubleBlockShortCheck,0}
  1624. !args      {#word,#word,#word}
  1625. !libs
  1626. !subs      {_MDoubleBlock,_MDoubleBlockCheck,0}
  1627. !name      {"MSBlock","[ShapeNumber.w,]Xpos.w,Ypos.w ; Block-blit shape to bitmap & cookie 2 stencil, Xpos&Width in 16's"}
  1628.  
  1629. !astatement
  1630. !args      {#byte}
  1631. !libs
  1632. !subs      {_MDoubleBlitCut,0,0}
  1633. !name      {"MSBlitCut","On/Off ; 0=Paste stencil/cookie, <>0=Cut using stencil/cookie"}
  1634.  
  1635. !acommand  {#word}
  1636. !args
  1637. !libs
  1638. !subs      {_MDoubleQBlitModeShort,0,0}
  1639. !args      {#word}
  1640. !libs
  1641. !subs      {_MDoubleQBlitMode,_MDoubleQBlitModeCheck,0}
  1642. !name {"MQSBlitMode","[([]Mode.w[])] ;CookieMode/EraseMode/InvMode/SolidMode/MColourMode/MReMapMode/MSimpleReMapMode/MAddMode"}
  1643.  
  1644. !astatement
  1645. !args      {#word,#word}
  1646. !libs
  1647. !subs      {_MDoubleQBlitShortest,_MDoubleQBlitShortestCheck,0}
  1648. !args      {#word,#word,#word}
  1649. !libs
  1650. !subs      {_MDoubleQBlitShort,_MDoubleQBlitShortCheck,0}
  1651. !args      {#word,#word,#word,#word}
  1652. !libs
  1653. !subs      {_MDoubleQBlit,_MDoubleQBlitCheck,0}
  1654. !name      {"MQSBlit","[[Queue.w,]ShapeNumber.w,]Xpos.w,Ypos,w ; QBlit shape to bitmap and cookie to stencil, any coords"}
  1655.  
  1656. !astatement
  1657. !args      {#word,#word}
  1658. !libs
  1659. !subs      {_MDoubleQBlockShortest,_MDoubleQBlockShortestCheck,0}
  1660. !args      {#word,#word,#word}
  1661. !libs
  1662. !subs      {_MDoubleQBlockShort,_MDoubleQBlockShortCheck,0}
  1663. !args      {#word,#word,#word,#word}
  1664. !libs
  1665. !subs      {_MDoubleQBlock,_MQBlockCheck,0}
  1666. !name      {"MQSBlock","[[Queue.w,]ShapeNumber.w,]Xpos.w,Ypos.w ; QBlock-blit shape 2 bitmap, Xpos&width mult of 16"}
  1667.  
  1668. !astatement
  1669. !args      {#byte}
  1670. !libs
  1671. !subs      {_MDoubleQBlitCut,0,0}
  1672. !name      {"MQSBlitCut","On/Off ; 0=Paste stencil/cookie, <>0=Cut using stencil/cookie. Adds entry to queue"}
  1673.  
  1674. !astatement
  1675. !args      {#word,#word,#word,#word}
  1676. !libs
  1677. !subs      {_MBoxFShort,_MBoxFShortCheck,0}
  1678. !args      {#word,#word,#word,#word,#byte}
  1679. !libs
  1680. !subs      {_MBoxF,_MBoxFCheck,0}
  1681. !name      {"MBoxF","Xpos.w,Ypos.w,Xpos2.w,Ypos2.w[,Colour] Draw a filled box in a bitmap in DrawingMode"}
  1682.  
  1683. !astatement
  1684. !args      {#word,#word,#word,#word}
  1685. !libs
  1686. !subs      {_MBoxFShapeShort,_MBoxFShapeShortCheck,0}
  1687. !args      {#word,#word,#word,#word,#byte}
  1688. !libs
  1689. !subs      {_MBoxFShape,_MBoxFShapeCheck,0}
  1690. !name      {"MBoxFShape","Xpos.w,Ypos.w,Xpos2.w,Ypos2.w[,Colour] Draw a filled box in a shape in DrawingMode"}
  1691.  
  1692. !astatement
  1693. !args      {#word,#word,#word,#word}
  1694. !libs
  1695. !subs      {_MBoxFStencilShort,_MBoxFStencilShortCheck,0}
  1696. !args      {#word,#word,#word,#word,#byte}
  1697. !libs
  1698. !subs      {_MBoxFStencil,_MBoxFStencilCheck,0}
  1699. !name      {"MBoxFStencil","Xpos.w,Ypos.w,Xpos2.w,Ypos2.w[,Colour] Draw a filled box in a stencil in DrawingMode"}
  1700.  
  1701. !astatement
  1702. !args      {#word,#word,#word,#word}
  1703. !libs
  1704. !subs      {_MBoxFCookieShort,_MBoxFCookieShortCheck,0}
  1705. !args      {#word,#word,#word,#word,#byte}
  1706. !libs
  1707. !subs      {_MBoxFCookie,_MBoxFCookieCheck,0}
  1708. !name      {"MBoxFCookie","Xpos.w,Ypos.w,Xpos2.w,Ypos2.w[,Colour] Draw a filled box in a cookie in DrawingMode"}
  1709.  
  1710. !astatement
  1711. !args      {#word,#word,#word,#word}
  1712. !libs
  1713. !subs      {_MBoxShort,_MBoxShortCheck,0}
  1714. !args      {#word,#word,#word,#word,#byte}
  1715. !libs
  1716. !subs      {_MBox,_MBoxCheck,0}
  1717. !name      {"MBox","Xpos.w,Ypos.w,Xpos2.w,Ypos2.w[,Colour] Draw an unfilled box in a bitmap in DrawingMode"}
  1718.  
  1719. !astatement
  1720. !args      {#word,#word,#word,#word}
  1721. !libs
  1722. !subs      {_MBoxShapeShort,_MBoxShapeShortCheck,0}
  1723. !args      {#word,#word,#word,#word,#byte}
  1724. !libs
  1725. !subs      {_MBoxShape,_MBoxShapeCheck,0}
  1726. !name      {"MBoxShape","Xpos.w,Ypos.w,Xpos2.w,Ypos2.w[,Colour] Draw an unfilled box in a shape in DrawingMode"}
  1727.  
  1728. !astatement
  1729. !args      {#word,#word,#word,#word}
  1730. !libs
  1731. !subs      {_MBoxStencilShort,_MBoxStencilShortCheck,0}
  1732. !args      {#word,#word,#word,#word,#byte}
  1733. !libs
  1734. !subs      {_MBoxStencil,_MBoxStencilCheck,0}
  1735. !name      {"MBoxStencil","Xpos.w,Ypos.w,Xpos2.w,Ypos2.w[,Colour] Draw an unfilled box in a stencil in DrawingMode"}
  1736.  
  1737. !astatement
  1738. !args      {#word,#word,#word,#word}
  1739. !libs
  1740. !subs      {_MBoxCookieShort,_MBoxCookieShortCheck,0}
  1741. !args      {#word,#word,#word,#word,#byte}
  1742. !libs
  1743. !subs      {_MBoxCookie,_MBoxCookieCheck,0}
  1744. !name      {"MBoxCookie","Xpos.w,Ypos.w,Width.w,Height.w[,Colour] Draw an unfilled box in a cookie in DrawingMode"}
  1745.  
  1746. !astatement
  1747. !args      {#word,#long}
  1748. !libs
  1749. !subs      {_MPlanar16ToBitmapShort,_MPlanar16ToBitmapShortCheck,0}
  1750. !args      {#word,#long,#word,#word,#word,#word}
  1751. !libs
  1752. !subs      {_MPlanar16ToBitmap,_MPlanar16ToBitmapCheck,0}
  1753. !name      {"MPlanar16ToBitmap","BitmapNum.w,PlanarAddr.l[,OpWidth.w,OpHeight.w,PlanarWidth.w,PlanarHeight.w] ; Convert p2c"}
  1754.  
  1755. !astatement
  1756. !args      {#word,#long}
  1757. !libs
  1758. !subs      {_MPlanar16ToShapeShort,_MPlanar16ToShapeShortCheck,0}
  1759. !args      {#word,#long,#word,#word,#word,#word}
  1760. !libs
  1761. !subs      {_MPlanar16ToShape,_MPlanar16ToShapeCheck,0}
  1762. !name      {"MPlanar16ToShape","ShapeNum.w,PlanarAddr.l[,OpWidth.w,OpHeight.w,PlanarWidth.w,PlanarHeight.w] ; Convert p2c"}
  1763.  
  1764. !afunction {#long}
  1765. !args      {#word,#word,#long,#word}
  1766. !libs
  1767. !subs      {_MGenericPtr,_MGenericPtrCheck,0}
  1768. !name      {"MGenericPtr","Xpos.w,Ypos.w,BaseAddress.l,RowWidth.w ; Calculate and return address based on inputs"}
  1769.  
  1770. !acommand  {#long}
  1771. !args      {#word,#long}
  1772. !libs
  1773. !subs      {_MCludgeCookie,_MCludgeCookieCheck,0}
  1774. !name      {"MCludgeCookie","ShapeNumber.w,Memory.l ; Cludge shape's cookie from existing mem"}
  1775.  
  1776. !acommand  {#long}
  1777. !args      {#word,#long}
  1778. !libs
  1779. !subs      {_MCludgeStencil,_MCludgeStencilCheck,0}
  1780. !name      {"MCludgeStencil","BitmapNumber.w,Memory.l ; Cludge bitmap's stencil from existing mem"}
  1781.  
  1782. !astatement
  1783. !args      {#word}
  1784. !libs
  1785. !subs      {_MBlockUnQueueShort,_MBlockUnQueueShortCheck,0}
  1786. !args      {#word,#word}
  1787. !libs
  1788. !subs      {_MBlockUnQueue,_MBlockUnQueueCheck,0}
  1789. !args      {#word,#word,#word}
  1790. !libs
  1791. !subs      {_MBlockUnQueueRangeShort,_MBlockUnQueueRangeShortCheck,0}
  1792. !args      {#word,#word,#word,#word}
  1793. !libs
  1794. !subs      {_MBlockUnQueueRange,_MBlockUnQueueRangeCheck,0}
  1795. !name      {"MBlockUnQueue","QueueNumber.w[,FirstItem.w,LastItem.w][,BitmapNumber.w];Block-UnQueue [range of] objects[&flush]"}
  1796.  
  1797. !astatement
  1798. !args      {#long}
  1799. !libs
  1800. !subs      {_MReMapShortest,_MReMapShortestCheck,0}
  1801. !args      {#long,#word}
  1802. !libs
  1803. !subs      {_MReMapShort,_MReMapShortCheck,0}
  1804. !args      {#word,#word,#word}
  1805. !libs
  1806. !subs      {_MReMap,_MReMapCheck,0}
  1807. !name      {"MReMap","[Colour#0.b,Colour#1.b,BitmapNum.w] *or* [RemapTable.l[,BitmapNum.w]] ; Remap #0 to #1 or with table"}
  1808.  
  1809. !astatement
  1810. !args      {#long}
  1811. !libs
  1812. !subs      {_MReMapShapeShortest,_MReMapShapeShortestCheck,0}
  1813. !args      {#long,#word}
  1814. !libs
  1815. !subs      {_MReMapShapeShort,_MReMapShapeShortCheck,0}
  1816. !args      {#word,#word,#word}
  1817. !libs
  1818. !subs      {_MReMapShape,_MReMapShapeCheck,0}
  1819. !name      {"MReMapShape","[Colour#0.b,Colour#1.b,ShapeNum.w] *or* [RemapTable.l[,ShapeNum.w]] ; Remap #0 to #1 or with table"}
  1820.  
  1821. !astatement
  1822. !args      {#word,#word}
  1823. !libs
  1824. !subs      {_MLineShortest2,_MLineShortest2Check,0}
  1825. !args      {#word,#word,#byte}
  1826. !libs
  1827. !subs      {_MLineShortest,_MLineShortestCheck,0}
  1828. !args      {#word,#word,#word,#word}
  1829. !libs
  1830. !subs      {_MLineShort,_MLineShortCheck,0}
  1831. !args      {#word,#word,#word,#word,#byte}
  1832. !libs
  1833. !subs      {_MLine,_MLineCheck,0}
  1834. !name      {"MLine","[Xpos.w,Ypos.w,]Xpos2.w,Ypos2.w[,Colour.b] ;Draw a line from X1,Y1 to X2,Y2 in a Bitmap in DrawingMode"}
  1835.  
  1836. !astatement
  1837. !args      {#word,#word}
  1838. !libs
  1839. !subs      {_MLineShapeShortest2,_MLineShapeShortest2Check,0}
  1840. !args      {#word,#word,#byte}
  1841. !libs
  1842. !subs      {_MLineShapeShortest,_MLineShapeShortestCheck,0}
  1843. !args      {#word,#word,#word,#word}
  1844. !libs
  1845. !subs      {_MLineShapeShort,_MLineShapeShortCheck,0}
  1846. !args      {#word,#word,#word,#word,#byte}
  1847. !libs
  1848. !subs      {_MLineShape,_MLineShapeCheck,0}
  1849. !name   {"MLineShape","[Xpos.w,Ypos.w,]Xpos2.w,Ypos2.w[,Colour.b] ;Draw a line from X1,Y1 to X2,Y2 in a Shape in DrawingMode"}
  1850.  
  1851. !astatement
  1852. !args      {#word,#word}
  1853. !libs
  1854. !subs      {_MLineStencilShortest2,_MLineStencilShortest2Check,0}
  1855. !args      {#word,#word,#byte}
  1856. !libs
  1857. !subs      {_MLineStencilShortest,_MLineStencilShortestCheck,0}
  1858. !args      {#word,#word,#word,#word}
  1859. !libs
  1860. !subs      {_MLineStencilShort,_MLineStencilShortCheck,0}
  1861. !args      {#word,#word,#word,#word,#byte}
  1862. !libs
  1863. !subs      {_MLineStencil,_MLineStencilCheck,0}
  1864. !name {"MLineStencil","[Xpos.w,Ypos.w,]Xpos2.w,Ypos2.w[,Colour.b];Draw a line from X1,Y1 to X2,Y2 in a stencil in DrawingMode"}
  1865.  
  1866. !astatement
  1867. !args      {#word,#word}
  1868. !libs
  1869. !subs      {_MLineCookieShortest2,_MLineCookieShortest2Check,0}
  1870. !args      {#word,#word,#byte}
  1871. !libs
  1872. !subs      {_MLineCookieShortest,_MLineCookieShortestCheck,0}
  1873. !args      {#word,#word,#word,#word}
  1874. !libs
  1875. !subs      {_MLineCookieShort,_MLineCookieShortCheck,0}
  1876. !args      {#word,#word,#word,#word,#byte}
  1877. !libs
  1878. !subs      {_MLineCookie,_MLineCheck,0}
  1879. !name  {"MLineCookie","[Xpos.w,Ypos.w,]Xpos2.w,Ypos2.w[,Colour.b] ;Draw a line from X1,Y1 to X2,Y2 in a cookie in DrawingMode"}
  1880.  
  1881. !astatement
  1882. !args      {#word}
  1883. !libs
  1884. !subs      {_MInkShortest,_MInkShortestCheck,0}
  1885. !args      {#word,#word}
  1886. !libs
  1887. !subs      {_MInkShort,_MInkShortCheck,0}
  1888. !args      {#word,#word,#word}
  1889. !libs
  1890. !subs      {_MInk,_MInkCheck,0}
  1891. !name      {"MInk","MainColour.b[,SecondColour.b[,ThirdColour.b]] ; Set what colour to assume as currently used. 0..255"}
  1892.  
  1893. !afunction {#long}
  1894. !args
  1895. !libs
  1896. !subs      {_MColourMode,0,0}
  1897. !name      {"MColourMode",";Returns value 4 which represents `colour' mode in the blit modes"}
  1898.  
  1899. !acommand  {#long}
  1900. !args      {#word}
  1901. !libs
  1902. !subs      {_MReserveChunkyTables,_MReserveChunkyTablesCheck,0}
  1903. !name      {"MReserveTables","[(]NumberOfTables.w[)] ; Reserve structure-memory for Tables"}
  1904.  
  1905. !astatement
  1906. !args      {#word,#word}
  1907. !libs
  1908. !subs      {_MFreeChunkyTablesRange,_MFreeChunkyTablesRangeCheck,0}
  1909. !args
  1910. !libs
  1911. !subs      {_MFreeChunkyTables,_MFreeChunkyTablesCheck,0}
  1912. !args      {#word}
  1913. !libs
  1914. !subs      {_MFreeChunkyTable,_MFreeChunkyTableCheck,0}
  1915. !name      {"MFreeTable","[FirstTable.w[,LastTable.w]] TableNumber.w ; Free a Table, a range of tables or all tables"}
  1916.  
  1917. !afunction {#long}
  1918. !args
  1919. !libs
  1920. !subs      {_MAddrChunkyTableShort,_MAddrChunkyTableShortCheck,0}
  1921. !args      {#word}
  1922. !libs
  1923. !subs      {_MAddrChunkyTable,_MAddrChunkyTableCheck,0}
  1924. !name      {"MAddrTable","[(TableNumber.w)] ; Returns address of Table structure"}
  1925.  
  1926. !acommand  {#long}
  1927. !args      {#word,#long}
  1928. !libs
  1929. !subs      {_MChunkyTable,_MChunkyTableCheck,0}
  1930. !name      {"MTable","[(]TableNumber.w,SizeInBytes.l[)] ; Allocmem for Table list items"}
  1931.  
  1932. !astatement
  1933. !args      {#byte}
  1934. !libs
  1935. !subs      {_MAutoUseChunkyTables,0,0}
  1936. !name      {"MAutoUseTables","True/False ; Automatically `use' new Tables. <>0=True"}
  1937.  
  1938. !astatement
  1939. !args      {#word}
  1940. !libs
  1941. !subs      {_MUseChunkyTableShortest,_MUseChunkyTableShortestCheck,0}
  1942. !args      {#word,#word}
  1943. !libs
  1944. !subs      {_MUseChunkyTableShort,_MUseChunkyTableShortCheck,0}
  1945. !args      {#word,#word,#word}
  1946. !libs
  1947. !subs      {_MUseChunkyTable,_MUseChunkyTableCheck,0}
  1948. !name      {"MUseTable","MainTableNum.w[,SecondTableNum.w[,ThirdTableNum.w]] ; Current table(s) to use"}
  1949.  
  1950. !afunction {#word}
  1951. !args
  1952. !libs
  1953. !subs      {_MUsedChunkyTable,_MUsedChunkyTableCheck,0}
  1954. !name      {"MUsedTable"," ; Returns currently used Table"}
  1955.  
  1956. !afunction {#long}
  1957. !args
  1958. !libs
  1959. !subs      {_MTablePtrShort,_MTablePtrShortCheck,0}
  1960. !args      {#word}
  1961. !libs
  1962. !subs      {_MTablePtr,_MTablePtrCheck,0}
  1963. !name      {"MTablePtr","[TableNum.w] ; Returns pointer to base of the table itself"}
  1964.  
  1965. !afunction {#long}
  1966. !args
  1967. !libs
  1968. !subs      {_MReMapMode,0,0}
  1969. !name      {"MReMapMode",";Returns value 5 which represents `ReMap' mode in the blit modes (uses current 2-dimensional table)"}
  1970.  
  1971. !afunction {#long}
  1972. !args
  1973. !libs
  1974. !subs      {_MSimpleReMapMode,0,0}
  1975. !name      {"MSimpleReMapMode",";Returns value 6 which is `SimpleReMap' mode in blit modes (uses current 1-dimensional table)"}
  1976.  
  1977. !acommand  {#word}
  1978. !args
  1979. !libs
  1980. !subs      {_MSMaskScrollModeShort,0,0}
  1981. !args      {#word}
  1982. !libs
  1983. !subs      {_MSMaskScrollMode,_MSMaskScrollModeCheck,0}
  1984. !name {"MSMaskScrollMode","[([]Mode.w[])];CookieMode/EraseMode/InvMode/SolidMode/MColourMode/MReMapMode/MSimpleReMapMode/MAdd"}
  1985.  
  1986. !astatement
  1987. !args      {#long,#long}
  1988. !libs
  1989. !subs      {_MPlotParticlesShort,_MPlotParticlesCheck,0}
  1990. !args      {#long,#long,#word}
  1991. !libs
  1992. !subs      {_MPlotParticles,_MPlotParticlesCheck,0}
  1993. !name      {"MPlotParticles","CoordinateList.l,NumPoints.l[,Colour.b] ; Plot lots of points from a table of positions"}
  1994.  
  1995. !astatement
  1996. !args      {#long,#long,#long}
  1997. !libs
  1998. !subs      {_MGrabParticles,_MGrabParticlesCheck,0}
  1999. !name      {"MGrabParticles","CoordinateList.l,NumPoints.l,Buffer.l ; Grab lots of points from a table into buffer mem"}
  2000.  
  2001. !astatement
  2002. !args      {#long,#long,#long}
  2003. !libs
  2004. !subs      {_MDrawParticles,_MDrawParticlesCheck,0}
  2005. !name      {"MDrawParticles","CoordinateList.l,NumPoints.l,Buffer.l ; Draw lots of previously grabbed points using a table"}
  2006.  
  2007. !astatement
  2008. !args      {#long,#long,#long}
  2009. !libs
  2010. !subs      {_MGrabParticlesAndPlotShort,_MGrabParticlesAndPlotCheck,0}
  2011. !args      {#long,#long,#long,#word}
  2012. !libs
  2013. !subs      {_MGrabParticlesAndPlot,_MGrabParticlesAndPlotCheck,0}
  2014. !name      {"MGrabParticlesAndPlot","CoordinateList.l,NumPoints.l,Buffer.l[,Colour.b]; Grabs points to buffer & plots table"}
  2015.  
  2016. !astatement
  2017. !args      {#long,#long,#long}
  2018. !libs
  2019. !subs      {_MAddToParticlesShort,_MAddToParticlesShortCheck,0}
  2020. !args      {#long,#long,#long,#long}
  2021. !libs
  2022. !subs      {_MAddToParticles,_MAddToParticlesCheck,0}
  2023. !name      {"MAddToParticles","CoordinateList.l,NumPoints.l,IncA.l[,IncB.l] ; Add [two sets of] increments to particle list"}
  2024.  
  2025. !astatement
  2026. !args      {#long,#long}
  2027. !libs
  2028. !subs      {_MWrapParticles,_MWrapParticlesCheck,0}
  2029. !name      {"MWrapParticles","CoordinateList.l,NumPoints.l ; Bring particles in from opposite edge to which they left"}
  2030.  
  2031. !astatement
  2032. !args      {#long,#long,#long,#word}
  2033. !libs
  2034. !subs      {_MReboundParticles,_MReboundParticlesCheck,0}
  2035. !name      {"MReboundParticles","CoordinateList.l,NumPoints.l,DirectionList.l,DetectSize.w ; Bounce off edges (NOT Ptr.l!!!)"}
  2036.  
  2037. !afunction {#word}
  2038. !args
  2039. !libs
  2040. !subs      {_MProcessor,0,0}
  2041. !name      {"MProcessor","; Returns value 0..6 representing MC68000..MC68060 cpu according to exec\AttnFlags"}
  2042.  
  2043. !astatement
  2044. !args      {#long,#long,#word,#word}
  2045. !libs
  2046. !subs      {_MAddXYToParticles,_MAddXYToParticlesCheck,0}
  2047. !name      {"MAddXYToParticles","CoordinateList.l,NumPoints.l,XToAdd.w,YToAdd.w ; Add constants to all particles"}
  2048.  
  2049. !astatement
  2050. !args      {#long,#long,#long}
  2051. !libs
  2052. !subs      {_MAddXYToParticlesA,_MAddXYToParticlesACheck,0}
  2053. !name      {"MAddXYToParticlesA","CoordinateList.l,NumPoints.l,ValueToAdd.l ; Add constant to all particle pointers"}
  2054.  
  2055. !astatement
  2056. !args      {#long,#long,#quick,#quick}
  2057. !libs
  2058. !subs      {_MAddXYToParticlesQ,_MAddXYToParticlesQCheck,0}
  2059. !name      {"MAddXYToParticlesQ","CoordinateList.l,NumPoints.l,XToAdd.q,YToAdd.q ; Add constants to all particles"}
  2060.  
  2061. !acommand  {#word}
  2062. !args
  2063. !libs
  2064. !subs      {_MParticleModeShort,0,0}
  2065. !args      {#word}
  2066. !libs
  2067. !subs      {_MParticleMode,_MParticleModeCheck,0}
  2068. !name {"MParticleMode","Mode.w or () ; MColourMode, MSimpleReMapMode, MReMapMode or MAddMode - to use in particle plot/draw"}
  2069.  
  2070. !afunction {#long}
  2071. !args
  2072. !libs
  2073. !subs      {_MMildredBase,0,0}
  2074. !name      {"MMildredBase"," ; Returns long address of the base of Mildred's internal data area"}
  2075.  
  2076. !acommand  {#word}
  2077. !args
  2078. !libs
  2079. !subs      {_MDrawingModeShort,0,0}
  2080. !args      {#word}
  2081. !libs
  2082. !subs      {_MDrawingMode,_MDrawingModeCheck,0}
  2083. !name {"MDrawingMode","[(]Mode.w[)] ; InvMode/MColourMode/MReMapMode/MSimpleReMapMode/MAddMode to use for drawing (MPlot etc)"}
  2084.  
  2085. !acommand  {#byte}
  2086. !args
  2087. !libs
  2088. !subs      {_MParticleFormat,0,0}
  2089. !args      {#byte}
  2090. !libs
  2091. !subs      {_MParticleFormat,0,0}
  2092. !name      {"MParticleFormat","[(]Format.b[)] ; Set particle lists/operation format. 0 = X.w,Y.w, <0 = X.q,Y.q, >0 = Ptr.l"}
  2093.  
  2094. !astatement
  2095. !args      {#word,#byte}
  2096. !libs
  2097. !subs      {_MPictureDissolveIn,_MPictureDissolveInCheck,0}
  2098. !name      {"MPictureDissolveIn","PictureBitmapNum.w,Colour.b ; Do a picture-based colour-number dissolve-in of a bitmap"}
  2099.  
  2100. !astatement
  2101. !args      {#word,#byte,#byte}
  2102. !libs
  2103. !subs      {_MPictureDissolveOut,_MPictureDissolveOutCheck,0}
  2104. !name      {"MPictureDissolveOut","PictureBitmapNum.w,Colour.b,WipeToColour.b ;Do picture-based colour dissolve-out of bitmap"}
  2105.  
  2106. !astatement
  2107. !args      {#quick,#quick,#quick,#quick,#word,#word,#word,#word,#word}
  2108. !libs
  2109. !subs      {_MZoomShort,_MZoomShortCheck,0}
  2110. !args      {#quick,#quick,#quick,#quick,#word,#word,#word,#word,#word,#word}
  2111. !libs
  2112. !subs      {_MZoom,_MZoomCheck,0}
  2113. !args      {#quick,#quick,#quick,#quick,#word,#word,#word,#word,#word,#word,#long}
  2114. !libs
  2115. !subs      {_MZoomCustom,_MZoomCustomCheck,0}
  2116. !name      {"MZoom","SrcX.q,SrcY.q,XAdd.q,YAdd.q,DestX.w,DestY.w,OpWidth.w,OpHeight.w,DeRes?.w[,SrcBmap.w[,CustomOffsets.l]]"}
  2117.  
  2118. !astatement
  2119. !args      {#quick,#quick,#quick,#quick,#word,#word,#word,#word,#word}
  2120. !libs
  2121. !subs      {_MZoomShapeShort,_MZoomShapeShortCheck,0}
  2122. !args      {#quick,#quick,#quick,#quick,#word,#word,#word,#word,#word,#word}
  2123. !libs
  2124. !subs      {_MZoomShape,_MZoomShapeCheck,0}
  2125. !args      {#quick,#quick,#quick,#quick,#word,#word,#word,#word,#word,#word,#long}
  2126. !libs
  2127. !subs      {_MZoomShapeCustom,_MZoomShapeCustomCheck,0}
  2128. !name      {"MZoomShape","SrcX.q,SrcY.q,XAdd.q,YAdd.q,DestX.w,DestY.w,OpWidth.w,OpHeight.w,DeRes?.w[,SrcShap.w[,CustOffs.l]]"}
  2129.  
  2130. !astatement
  2131. !args      {#quick,#quick,#quick,#quick,#word,#word,#word,#word,#word}
  2132. !libs
  2133. !subs      {_MZoomBitmapToShapeShort,_MZoomBitmapToShapeShortCheck,0}
  2134. !args      {#quick,#quick,#quick,#quick,#word,#word,#word,#word,#word,#word}
  2135. !libs
  2136. !subs      {_MZoomBitmapToShape,_MZoomBitmapToShapeCheck,0}
  2137. !args      {#quick,#quick,#quick,#quick,#word,#word,#word,#word,#word,#word,#long}
  2138. !libs
  2139. !subs      {_MZoomBitmapToShapeCustom,_MZoomBitmapToShapeCustomCheck,0}
  2140. !name  {"MZoomBitmapToShape","SrcX.q,SrcY.q,XAdd.q,YAdd.q,DstX.w,DstY.w,OpWid.w,OpHeight.w,DeRes?.w[,SrcBmap.w[,CustOffs.l]]"}
  2141.  
  2142. !astatement
  2143. !args      {#quick,#quick,#quick,#quick,#word,#word,#word,#word,#word}
  2144. !libs
  2145. !subs      {_MZoomShapeToBitmapShort,_MZoomShapeToBitmapShortCheck,0}
  2146. !args      {#quick,#quick,#quick,#quick,#word,#word,#word,#word,#word,#word}
  2147. !libs
  2148. !subs      {_MZoomShapeToBitmap,_MZoomShapeToBitmapCheck,0}
  2149. !args      {#quick,#quick,#quick,#quick,#word,#word,#word,#word,#word,#word,#long}
  2150. !libs
  2151. !subs      {_MZoomShapeToBitmapCustom,_MZoomShapeToBitmapCustomCheck,0}
  2152. !name {"MZoomShapeToBitmap","SrcX.q,SrcY.q,XAdd.q,YAdd.q,DstX.w,DstY.w,OpWidth.w,OpHeight.w,DeRes?.w[,SrcShap.w[,CustOffs.l]]"}
  2153.  
  2154. Init
  2155. !nullsub{Initialise,0,0}
  2156. Finish
  2157. !nullsub{FinishUp,0,0}
  2158. !libfin
  2159.  
  2160. ;**-Macros-***************************************************************************
  2161. .Macros
  2162.  
  2163. Macro SetupScroll
  2164. ;Initialise scroll routines
  2165. ;`1=ShuffleRegs routine number
  2166. ;`2=Current object labelname
  2167. ;`3=Setup routine keyword
  2168. ;`4=InitialiseRegs routine number
  2169. ;`5=Blit routine labelname
  2170. ;`6=Label counter
  2171.   !ShuffleRegs`1{001`6}
  2172.   MOVE.w  Current`2,d0 ; Dest resource
  2173.   !_M`3Setup
  2174.   MOVEM.l a2-a6,-(a7) ; Store
  2175.   MOVE.w  d6,-(a7) ; Store seperately
  2176.   MOVEM.w d0/d7,-(a7) ; Store seperately
  2177.   MOVEM.w d2-d5,-(a7) ; Store seperately
  2178.   !InitData3 ; Shared setup
  2179.   BSR     InitialiseRegs`4 ; Init blit
  2180.   BRA     `5Routine ; Jump to routine
  2181. End Macro
  2182.  
  2183. Macro SetupScroll2
  2184. ;Initialise scroll routines
  2185. ;`1=ShuffleRegs routine number
  2186. ;`2=Current object labelname
  2187. ;`3=Setup routine keyword
  2188. ;`4=InitialiseRegs routine number
  2189. ;`5=Blit routine labelname
  2190. ;`6=Label counter
  2191.   MOVE.w  -(a2),d6 ; Get source bitmap number
  2192.   MOVE.l  -(a2),LongwordStore ; Grab OffsetsList.l
  2193.   !ShuffleRegs`1{002`6`6}
  2194.   MOVE.w  Current`2,d0 ; Dest resource
  2195.   !_M`3Setup
  2196.   MOVEM.l a2-a6,-(a7) ; Store
  2197.   MOVE.w  d6,-(a7) ; Store seperately
  2198.   MOVEM.w d0/d7,-(a7) ; Store seperately
  2199.   MOVEM.w d2-d5,-(a7) ; Store seperately
  2200.   !InitData3 ; Shared setup
  2201.   BSR     InitialiseRegs`4 ; Init blit
  2202.   BRA     `5Routine2 ; Jump to routine
  2203. End Macro
  2204.  
  2205. Macro ChooseScrollMethod
  2206. ;Choose direction and blit type for scroll
  2207. ;`1=Number of the scroll routine
  2208. ;`2=Label counter
  2209.   MOVEM.w (a7)+,d2-d5 ; Restore
  2210.   !InitData2 ; Shared setup
  2211.   MOVEM.w (a7)+,d0/d7 ; Restore
  2212.   CMP.w   d0,d7
  2213.   BEQ     _MScrollSDSame`2 ; Source and dest are same object
  2214.   MOVE.w  (a7)+,d0 ; Restore (was d6)
  2215. _MScrollSDDiff`2
  2216.   MOVE.l  a6,d7 ; Replace
  2217.   BSR     PerformGenericBlit`1 ; Blit forwards
  2218.   BRA     _MScrollSkip2`2
  2219. _MScrollSDSame`2
  2220.   MOVE.w  (a7)+,d0 ; Restore (was d6)
  2221.   CMP.w   d5,d1 ; X1>X2?
  2222.   BGE     _MScrollTest2`2
  2223.   CMP.w   d0,d2 ; Y1>Y2?
  2224.   BGT     _MScrollSDDiff`2
  2225.   BRA     _MScrollDescend`2
  2226. _MScrollTest2`2
  2227.   CMP.w   d0,d2 ; Y1>Y2?
  2228.   BLT     _MScrollDescend`2
  2229.   BRA     _MScrollSDDiff`2
  2230. _MScrollDescend`2
  2231.   MOVE.l  a6,d7 ; Replace
  2232.   BSR     PerformGenericBlit`1b ; Blit backwards
  2233. _MScrollSkip2`2
  2234.   MOVEM.l (a7)+,a2-a6 ; Restore
  2235.   RTS
  2236. End Macro
  2237.  
  2238. Macro ChooseScrollMethod2
  2239. ;Choose direction and blit type for scroll
  2240. ;`1=Number of the scroll routine
  2241. ;`2=Label counter
  2242.   MOVEM.w (a7)+,d2-d5 ; Restore
  2243.   !InitData2 ; Shared setup
  2244.   MOVEM.w (a7)+,d0/d7 ; Restore
  2245.   CMP.w   d0,d7
  2246.   BEQ     _MScrollSDSame`2`2 ; Source and dest are same object
  2247.   MOVE.w  (a7)+,d0 ; Restore (was d6)
  2248. _MScrollSDDiff`2`2
  2249.   MOVE.l  a6,d7 ; Replace
  2250.   BSR     PerformGenericBlit`1Custom ; Blit forwards using OffsetList
  2251.   BRA     _MScrollSkip2`2`2
  2252. _MScrollSDSame`2`2
  2253.   MOVE.w  (a7)+,d0 ; Restore (was d6)
  2254.   CMP.w   d5,d1 ; X1>X2?
  2255.   BGE     _MScrollTest2`2`2
  2256.   CMP.w   d0,d2 ; Y1>Y2?
  2257.   BGT     _MScrollSDDiff`2`2
  2258.   BRA     _MScrollDescend`2`2
  2259. _MScrollTest2`2`2
  2260.   CMP.w   d0,d2 ; Y1>Y2?
  2261.   BLT     _MScrollDescend`2`2
  2262.   BRA     _MScrollSDDiff`2`2
  2263. _MScrollDescend`2`2
  2264.   MOVE.l  a6,d7 ; Replace
  2265.   BSR     PerformGenericBlit`1bCustom ; Blit backwards using OffsetList
  2266. _MScrollSkip2`2`2
  2267.   MOVEM.l (a7)+,a2-a6 ; Restore
  2268.   RTS
  2269. End Macro
  2270.  
  2271. Macro ChooseDoubleScrollMethod
  2272. ;Choose direction and blit type for doublescroll
  2273. ;`1=Number of the normal scroll routine
  2274. ;`2=Number of the cut scroll routine
  2275. ;`3=Label counter
  2276.   MOVEM.w (a7)+,d2-d5 ; Restore
  2277.   !InitData2 ; Shared setup
  2278.   MOVEM.w (a7)+,d0/d7 ; Restore
  2279.   CMP.w   d0,d7
  2280.   BEQ     _MDoubleScrollSDSame`3 ; Source and dest are same object
  2281.   MOVE.w  (a7)+,d0 ; Restore (was d6)
  2282. _MDoubleScrollSDDiff`3
  2283.   MOVE.l  a6,d7 ; Replace
  2284.   TST.b   DoubleScrollMode ; What type of blit?
  2285.   BNE     _MDoubleScrollSDDiffB`3
  2286. _MDoubleScrollSDDiffA`3
  2287.   BSR     PerformGenericBlit`1 ; Blit data and stencil-blit
  2288.   BRA     _MDoubleScrollSkip2`3
  2289. _MDoubleScrollSDDiffB`3
  2290.   BSR     PerformGenericBlit`2 ; Blit data and cut
  2291.   BRA     _MDoubleScrollSkip2`3
  2292. _MDoubleScrollSDSame`3
  2293.   MOVE.w  (a7)+,d0 ; Restore (was d6)
  2294.   CMP.w   d5,d1 ; X1>X2?
  2295.   BGE     _MDoubleScrollTest2`3
  2296.   CMP.w   d0,d2 ; Y1>Y2?
  2297.   BGT     _MDoubleScrollSDDiff`3
  2298.   BRA     _MDoubleScrollDescend`3
  2299. _MDoubleScrollTest2`3
  2300.   CMP.w   d0,d2 ; Y1>Y2?
  2301.   BLT     _MDoubleScrollDescend`3
  2302.   BRA     _MDoubleScrollSDDiff`3
  2303. _MDoubleScrollDescend`3
  2304.   MOVE.l  a6,d7 ; Replace
  2305.   TST.b   DoubleScrollMode ; What type of blit?
  2306.   BNE     _MDoubleScrollDescendB`3
  2307. _MDoubleScrollDescendA`3
  2308.   BSR     PerformGenericBlit`1b ; Blit data and stencil-blit
  2309.   BRA     _MDoubleScrollSkip2`3
  2310. _MDoubleScrollDescendB`3
  2311.   BSR     PerformGenericBlit`2b ; Blit data and cut
  2312. _MDoubleScrollSkip2`3
  2313.   MOVEM.l (a7)+,a2-a6 ; Restore
  2314.   RTS
  2315. End Macro
  2316.  
  2317. Macro ChooseDoubleScrollMethod2
  2318. ;Choose direction and blit type for doublescroll
  2319. ;`1=Number of the normal scroll routine
  2320. ;`2=Number of the cut scroll routine
  2321. ;`3=Label counter
  2322.   MOVEM.w (a7)+,d2-d5 ; Restore
  2323.   !InitData2 ; Shared setup
  2324.   MOVEM.w (a7)+,d0/d7 ; Restore
  2325.   CMP.w   d0,d7
  2326.   BEQ     _MDoubleScrollSDSame`3`3 ; Source and dest are same object
  2327.   MOVE.w  (a7)+,d0 ; Restore (was d6)
  2328. _MDoubleScrollSDDiff`3`3
  2329.   MOVE.l  a6,d7 ; Replace
  2330.   TST.b   DoubleScrollMode ; What type of blit?
  2331.   BNE     _MDoubleScrollSDDiffB`3`3
  2332. _MDoubleScrollSDDiffA`3`3
  2333.   BSR     PerformGenericBlit`1Custom ; Blit data and stencil-blit using OffsetList
  2334.   BRA     _MDoubleScrollSkip2`3`3
  2335. _MDoubleScrollSDDiffB`3`3
  2336.   BSR     PerformGenericBlit`2Custom ; Blit data and cut using OffsetList
  2337.   BRA     _MDoubleScrollSkip2`3`3
  2338. _MDoubleScrollSDSame`3`3
  2339.   MOVE.w  (a7)+,d0 ; Restore (was d6)
  2340.   CMP.w   d5,d1 ; X1>X2?
  2341.   BGE     _MDoubleScrollTest2`3`3
  2342.   CMP.w   d0,d2 ; Y1>Y2?
  2343.   BGT     _MDoubleScrollSDDiff`3`3
  2344.   BRA     _MDoubleScrollDescend`3`3
  2345. _MDoubleScrollTest2`3`3
  2346.   CMP.w   d0,d2 ; Y1>Y2?
  2347.   BLT     _MDoubleScrollDescend`3`3
  2348.   BRA     _MDoubleScrollSDDiff`3`3
  2349. _MDoubleScrollDescend`3`3
  2350.   MOVE.l  a6,d7 ; Replace
  2351.   TST.b   DoubleScrollMode ; What type of blit?
  2352.   BNE     _MDoubleScrollDescendB`3`3
  2353. _MDoubleScrollDescendA`3`3
  2354.   BSR     PerformGenericBlit`1bCustom ; Blit data and stencil-blit using OffsetList
  2355.   BRA     _MDoubleScrollSkip2`3`3
  2356. _MDoubleScrollDescendB`3`3
  2357.   BSR     PerformGenericBlit`2bCustom ; Blit data and cut using OffsetList
  2358. _MDoubleScrollSkip2`3`3
  2359.   MOVEM.l (a7)+,a2-a6 ; Restore
  2360.   RTS
  2361. End Macro
  2362.  
  2363. Macro ReserveChunkyResourceStructs
  2364. ;Reserve new structure memory for Chunky Resource structures
  2365. ;`1=Label counter
  2366. ;d7=Number of objects required
  2367. ;d6=Memory address of existing structure
  2368. ;d5=Number of existing objects
  2369.   AND.l   #$FFFF,d7
  2370.   TST.l   d6 ; Check for existing mem allocated
  2371.   BEQ     ReserveChunkyResourceSkip`1 ; If exists, deallocate
  2372.   MOVE.l  d5,d4 ; d4=loopcounter
  2373.   SUBQ.l  #1,d4
  2374. ReserveCRSloop`1
  2375.   MOVE.l  d6,a0 ; Mem base
  2376.   MOVE.l  d4,d3 ; Current object
  2377.   LSL.l   #ChunkyResourceStructSize,d3 ; offset
  2378.   ADD.l   d3,a0 ; Point
  2379.   !DeallocResourceObject{001`1}
  2380.   DBRA    d4,ReserveCRSloop`1
  2381.   MOVE.l  d5,d0 ; Number of resources
  2382.   LSL.l   #ChunkyResourceStructSize,d0
  2383.   MOVE.l  d6,a1 ; Mem address
  2384.   ALibJsr #BlitzFreemem ; Free memory
  2385.   MOVE.l  d7,d0
  2386. ReserveChunkyResourceSkip`1
  2387.   MOVE.l  d7,d0 ; Requested number of resources
  2388.   LSL.l   #ChunkyResourceStructSize,d0
  2389.   MOVE.l  #ClearPublicMem,d1 ; MemType (public and clear)
  2390.   !CheckAvailMem{001`1}
  2391.   TST.b   d2 ; Likely?
  2392.   BEQ     ReserveChunkyResourceFailed`1
  2393.   ALibJsr #BlitzAllocmem ; Allocate memory
  2394.   TST.l   d0
  2395.   BEQ     ReserveChunkyResourceFailed`1
  2396.   BRA     ReserveChunkyResourceSkip2`1 ; Return memory address in d0.l
  2397. ReserveChunkyResourceFailed`1
  2398.   MOVEQ.l #0,d0 ; Mem Empty - also errorcode
  2399.   MOVEQ.l #0,d7 ; Total Empty
  2400. ReserveChunkyResourceSkip2`1
  2401. End Macro
  2402.  
  2403. Macro DeallocResourceObject
  2404. ;Deallocate a single Chunky Resource, a0=address of single Resource struct
  2405. ;`1=Label counter
  2406.   MOVE.l  d0,-(a7) ; Store
  2407.   TST.l   CRsrc_Width-ChunkyResources(a0) ; Width and Height exist?
  2408.   BEQ     DeallocROSkip`1
  2409.   TST.l   CRsrc_DMem-ChunkyResources(a0) ; Mem?
  2410.   BEQ     DeallocNoBitmap`1
  2411.   TST.b   CRsrc_DHere-ChunkyResources(a0) ; Bitmap data here?
  2412.   BEQ     DeallocNoBitmap`1
  2413.   MOVE.l  CRsrc_DBytes-ChunkyResources(a0),d0 ; Size
  2414.   MOVE.l  CRsrc_DMem-ChunkyResources(a0),a1 ; Mem address
  2415.   ALibJsr #BlitzFreemem ; Free data memory
  2416. DeallocNoBitmap`1
  2417.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Mem?
  2418.   BEQ     DeallocNoStencil`1
  2419.   TST.b   CRsrc_SHere-ChunkyResources(a0) ; Stencil data here?
  2420.   BEQ     DeallocNoStencil`1
  2421.   MOVE.l  CRsrc_SBytes-ChunkyResources(a0),d0 ; Size
  2422.   MOVE.l  CRsrc_SMem-ChunkyResources(a0),a1 ; Mem address
  2423.   ALibJsr #BlitzFreemem ; Free stencil memory
  2424. DeallocNoStencil`1
  2425.   MOVE.l  #0,CRsrc_Width-ChunkyResources(a0) ; Wipe width and height to indicate dead structure
  2426. DeallocROSkip`1
  2427.   MOVE.l  (a7)+,d0 ; Restore
  2428. End Macro
  2429.  
  2430. Macro DeallocStencil
  2431. ;Deallocate a single Chunky Resource's stencil/cookie, a0=address of single Resource struct
  2432. ;`1=Label counter
  2433.   MOVE.l  d0,-(a7) ; Store
  2434.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Mem?
  2435.   BEQ     DeallocSNoStencil`1
  2436.   TST.b   CRsrc_SHere-ChunkyResources(a0) ; Stencil data here?
  2437.   BEQ     DeallocSNoStencil`1
  2438.   MOVE.l  CRsrc_SBytes-ChunkyResources(a0),d0 ; Size
  2439.   MOVE.l  CRsrc_SMem-ChunkyResources(a0),a1 ; Mem address
  2440.   ALibJsr #BlitzFreemem ; Free stencil memory
  2441. DeallocSNoStencil`1
  2442. DeallocSROSkip`1
  2443.   MOVE.l  (a7)+,d0 ; Restore
  2444. End Macro
  2445.  
  2446. Macro InitData
  2447. ;Shared setup use in shape/bitmap generating
  2448.   MOVE.w  d0,d5 ; Store object number
  2449.   MOVE.w  d1,d6 ; Store width
  2450.   MOVE.w  d2,d7 ; Store height
  2451.   EXT.l   d5
  2452.   EXT.l   d6
  2453.   EXT.l   d7
  2454.   MULU    d2,d1 ; Total bytes wanted
  2455.   ADD.l   #16,d1 ; For move16-align safety
  2456.   MOVE.l  d1,d4 ; Store total bytes
  2457.   MOVE.l  d1,d0 ; Pass param
  2458. End Macro
  2459.  
  2460. Macro InitData2
  2461. ;Shared routine used in Scroll
  2462.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d0
  2463.   SUB.w   d3,d0
  2464.   ADD.w   d0,d6 ; Add width difference to source linemod
  2465.   MOVE.w  CRsrc_Width-ChunkyResources(a1),d0
  2466.   SUB.w   d3,d0
  2467.   ADD.w   d0,d7 ; Add width difference to dest linemod
  2468.   MOVE.l  d7,a6 ; Copy
  2469. End Macro
  2470.  
  2471. Macro InitData3
  2472. ;Shared routine used in Scroll
  2473.   MOVE.l  d2,d3 ; Y1
  2474.   MOVE.l  d1,d2 ; X1
  2475.   MOVE.l  d5,d4 ; X2
  2476.   MOVE.l  d6,d5 ; Y2
  2477. End Macro
  2478.  
  2479. Macro CheckAvailMem
  2480. ;Having set up parameters ready to Allocmem, check it's available
  2481. ;Returns success in d2
  2482. ;`1=Label counter
  2483. ;d0=Amount required
  2484.   MOVEM.l d0/d1/a6,-(a7) ; Store
  2485.   MOVE.l  $4,a6        ; Execbase
  2486.   AND.l   #$FFFEFFFF,d1 ; Memtype without `clear'
  2487.   JSR     LVOAvailMem(a6)
  2488.   MOVE.l  d0,d2
  2489.   MOVEM.l (a7)+,d0/d1/a6 ; Restore
  2490.   CMP.l   d0,d2
  2491.   BLT     CheckAvMFailed`1
  2492.   MOVEM.l d0/d1/a6,-(a7) ; Store
  2493.   MOVE.l  $4,a6
  2494.   AND.l   #$FFFEFFFF,d1 ; Memtype without `clear'
  2495.   OR.l    #$20000,d1 ; Largest
  2496.   JSR     LVOAvailMem(a6)
  2497.   MOVE.l  d0,d2
  2498.   MOVEM.l (a7)+,d0/d1/a6 ; Restore
  2499.   CMP.l   d0,d2
  2500.   BLT     CheckAvMFailed`1
  2501.   MOVEQ.l #1,d2 ; Success
  2502.   BRA     CheckAvMSkip`1
  2503. CheckAvMFailed`1
  2504.   MOVEQ.l #0,d2 ; Error
  2505. CheckAvMSkip`1
  2506. End Macro
  2507.  
  2508. Macro NewChunkyMem
  2509. ;Allocate some new memory. d0=Amount
  2510. ;Returns success in d2
  2511. ;Returns mem pointer in d0
  2512. ;`1=Label counter
  2513. ;Corrupts a0 without telling you!
  2514.   MOVE.l  d1,-(a7) ; Store
  2515.   MOVE.l  #ClearPublicMem,d1 ; MemType
  2516.   !CheckAvailMem{002`1} ; Likely?
  2517.   TST.b   d2
  2518.   BEQ     NewCMemFailed`1 ; Nope
  2519.   ALibJsr #BlitzAllocmem ; Allocate memory
  2520.   TST.l   d0  ; Success?
  2521.   BEQ     NewCMemFailed`1 ; Nope
  2522.   MOVEQ.l #1,d2 ; Success
  2523.   MOVE.l  (a7)+,d1 ; Restore
  2524.   BRA     NewCMemSkip`1
  2525. NewCMemFailed`1
  2526.   MOVEQ.l #0,d2
  2527.   MOVE.l  (a7)+,d1 ; Restore
  2528. NewCMemSkip`1
  2529. End Macro
  2530.  
  2531. Macro StoreResourceDataMemInfo
  2532. ;Store data into structure from recently reserved data mem
  2533. ;d0=Memory base address
  2534. ;d4=Bytes reserved
  2535. ;a0=Structure base of object
  2536.   MOVE.l  d0,CRsrc_DMem-ChunkyResources(a0) ; Store mem pointer
  2537.   MOVE.l  d4,CRsrc_DBytes-ChunkyResources(a0) ; Store bytes of mem allocated
  2538.   MOVE.b  #1,CRsrc_DHere-ChunkyResources(a0) ; Data here = True
  2539.   ADD.l   #16,d0 ; Base+16
  2540.   AND.l   #$FFFFFFF0,d0 ; To nearest 16-bytes in mem (for move16)
  2541.   MOVE.l  d0,CRsrc_Data-ChunkyResources(a0) ; Store aligned mem pointer
  2542. End Macro
  2543.  
  2544. Macro StoreResourceDataMemInfo2
  2545. ;Store data into structure from cludged data mem
  2546. ;d0=Memory base address
  2547. ;d4=Bytes reserved
  2548. ;a0=Structure base of object
  2549.   MOVE.l  d0,CRsrc_DMem-ChunkyResources(a0) ; Store mem pointer
  2550.   MOVE.l  d4,CRsrc_DBytes-ChunkyResources(a0) ; Store bytes of mem cludged (unaligned)
  2551.   MOVE.b  #0,CRsrc_DHere-ChunkyResources(a0) ; Data here = False
  2552.   ADD.l   #16,d0 ; Base+16
  2553.   AND.l   #$FFFFFFF0,d0 ; To nearest 16-bytes in mem (for move16)
  2554.   MOVE.l  d0,CRsrc_Data-ChunkyResources(a0) ; Store aligned mem pointer
  2555. End Macro
  2556.  
  2557. Macro StoreResourceStencilMemInfo
  2558. ;Store data into structure from recently reserved stencil mem
  2559. ;d0=Memory base address
  2560. ;d4=Bytes reserved
  2561. ;a0=Structure base of object
  2562. ;Affects d0
  2563.   MOVE.l  d0,CRsrc_SMem-ChunkyResources(a0) ; Store mem pointer
  2564.   MOVE.l  d4,CRsrc_SBytes-ChunkyResources(a0) ; Store bytes of mem allocated
  2565.   MOVE.b  #1,CRsrc_SHere-ChunkyResources(a0) ; Data here = True
  2566.   ADD.l   #16,d0 ; Base+16
  2567.   AND.l   #$FFFFFFF0,d0 ; To nearest 16-bytes in mem (for move16)
  2568.   MOVE.l  d0,CRsrc_Stencil-ChunkyResources(a0) ; Store aligned mem pointer
  2569. End Macro
  2570.  
  2571. Macro StoreResourceStencilMemInfo2
  2572. ;Store data into structure from recently cludged stencil mem
  2573. ;d3=Memory base address
  2574. ;a0=Structure base of object
  2575. ;Trashes d3
  2576.   MOVE.l  d3,CRsrc_SMem-ChunkyResources(a0) ; Store mem pointer
  2577.   ADD.l   #16,d3 ; Base+16
  2578.   AND.l   #$FFFFFFF0,d3 ; To nearest 16-bytes in mem (for move16)
  2579.   MOVE.l  d3,CRsrc_Stencil-ChunkyResources(a0) ; Store aligned mem pointer
  2580.   MOVE.l  CRsrc_DBytes-ChunkyResources(a0),d3 ; Get databytes
  2581.   MOVE.b  #0,CRsrc_SHere-ChunkyResources(a0) ; Data here = False
  2582.   SUB.l   #16,d3 ; -16 for actual bytes of cludge data
  2583.   MOVE.l  d3,CRsrc_SBytes-ChunkyResources(a0) ; Store stencilbytes
  2584. End Macro
  2585.  
  2586. Macro Getc2pWindowObjectPtr
  2587. ;Get address of c2pWindow structure of specified c2pWindow
  2588. ;d0=c2pWindow number
  2589. ;Returns address in a0
  2590.   AND.l   #$FFFF,d0 ; Only words are valid
  2591.   LSL.l   #c2pWindowStructSize,d0
  2592.   MOVE.l  c2pWindowsMem,a0
  2593.   ADD.l   d0,a0
  2594.   LSR.l   #c2pWindowStructSize,d0 ; keep d0 intact
  2595. End Macro ; Return with a0=structure address
  2596.  
  2597. Macro GetBitmapObjectPtr
  2598. ;Get address of Resource structure of specific bitmap.
  2599. ;d0=Resource number
  2600. ;Returns address in a0
  2601.   AND.l   #$FFFF,d0 ; Only words are valid
  2602.   LSL.l   #ChunkyResourceStructSize,d0
  2603.   MOVE.l  ChunkyBitmapsMem,a0
  2604.   ADD.l   d0,a0
  2605.   LSR.l   #ChunkyResourceStructSize,d0 ; keep d0 intact
  2606. End Macro ; Return with a0=structure address
  2607.  
  2608. Macro GetShapeObjectPtr
  2609. ;Get address of Resource structure of specific shape.
  2610. ;d0=Resource number
  2611. ;Returns address in a0
  2612.   AND.l   #$FFFF,d0 ; Only words are valid
  2613.   LSL.l   #ChunkyResourceStructSize,d0
  2614.   MOVE.l  ChunkyShapesMem,a0
  2615.   ADD.l   d0,a0
  2616.   LSR.l   #ChunkyResourceStructSize,d0 ; keep d0 intact
  2617. End Macro ; Return with a0=structure address
  2618.  
  2619. Macro GetQueueObjectPtr
  2620. ;Get address of ChunkyQueue structure of specified ChunkyQueue
  2621. ;d0=ChunkyQueue number
  2622. ;Returns address in a0
  2623.   AND.l   #$FFFF,d0 ; Only words are valid
  2624.   LSL.l   #ChunkyQueueStructSize,d0
  2625.   MOVE.l  ChunkyQueuesMem,a0
  2626.   ADD.l   d0,a0
  2627.   LSR.l   #ChunkyQueueStructSize,d0 ; keep d0 intact
  2628. End Macro ; Return with a0=structure address
  2629.  
  2630. Macro GetTableObjectPtr
  2631. ;Get address of ChunkyTable structure of specified ChunkyTable
  2632. ;d0=ChunkyTable number
  2633. ;Returns address in a0
  2634.   AND.l   #$FFFF,d0 ; Only words are valid
  2635.   LSL.l   #ChunkyTableStructSize,d0
  2636.   MOVE.l  ChunkyTablesMem,a0
  2637.   ADD.l   d0,a0
  2638.   LSR.l   #ChunkyTableStructSize,d0 ; keep d0 intact
  2639. End Macro ; Return with a0=structure address
  2640.  
  2641. Macro FinishResourceInit
  2642. ;Routine to finish loading in data parameters to a new Resource structure
  2643. ;a0=address of struct
  2644.   MOVE.w  #0,CRsrc_XHandle-ChunkyResources(a0)
  2645.   MOVE.w  #0,CRsrc_YHandle-ChunkyResources(a0)
  2646.   MOVE.w  d6,CRsrc_Width-ChunkyResources(a0)
  2647.   MOVE.w  d7,CRsrc_Height-ChunkyResources(a0)
  2648.   MOVE.w  #0,CRsrc_LineMod-ChunkyResources(a0)
  2649.   MOVE.l  #0,CRsrc_WrapBytes-ChunkyResources(a0)
  2650.   MOVE.w  d6,CRsrc_TotWidth-ChunkyResources(a0)
  2651. End Macro
  2652.  
  2653. Macro SetResourceMidHandle
  2654. ;Routine to set the handle of a resource to the middle. a0=Base of struct
  2655.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d7 ; Get Width
  2656.   LSR.w   #1,d7 ; /2
  2657.   MOVE.w  d7,CRsrc_XHandle-ChunkyResources(a0) ; Store X Handle/origin
  2658.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d7 ; Get Height
  2659.   LSR.w   #1,d7 ; /2
  2660.   MOVE.w  d7,CRsrc_YHandle-ChunkyResources(a0) ; Store Y Handle/origin
  2661. End Macro
  2662.  
  2663. Macro PrepareStencilMemory
  2664. ;Routine to get new resource stencil mem if none suitable already defined
  2665. ;`1=Label counter
  2666. ;a0=Resource structure base
  2667. ;Puts mem address in d0
  2668. ;Puts bytes total size in d4
  2669. ;Puts height in d7
  2670. ;Returns d2 as success
  2671.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Stencil mem already present?
  2672.   BNE     PrepSMGotMem`1
  2673.   ;New stencil memory needed
  2674.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d0 ; TotalWidth
  2675.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d7 ; Height
  2676.   MULU    d7,d0 ; Total
  2677.   ADD.l   #16,d0
  2678.   MOVE.l  d0,d4
  2679.   MOVE.l  a0,a2 ;store
  2680.   !NewChunkyMem{007`1}
  2681.   MOVE.l  a2,a0 ;restore
  2682.   TST.b   d2 ; Got it?
  2683.   BEQ     PrepSMNotEnough`1
  2684.   !StoreResourceStencilMemInfo
  2685. PrepSMGotMem`1
  2686.   MOVEQ.l #1,d2 ; Success Result
  2687.   BRA     PrepSMDone`1
  2688. PrepSMNotEnough`1
  2689.   ;Memory alloc failed
  2690.   MOVE.b  #0,CRsrc_SHere-ChunkyResources(a0)
  2691.   MOVE.l  #0,CRsrc_Stencil-ChunkyResources(a0)
  2692.   MOVE.l  #0,CRsrc_SMem-ChunkyResources(a0)
  2693.   MOVEQ.l #0,d2 ; Error
  2694. PrepSMDone`1
  2695. End Macro
  2696.  
  2697. Macro RoundUpWidth
  2698. ;Used when creating new resource to ensure width is multiple of 4 (round up)
  2699. ;Trashes d7
  2700. ;`1=Lable counter
  2701. ;d1=Width.w
  2702.   MOVE.w  d1,d7 ; Temp
  2703.   AND.b   #$FC,d1 ; Round down width to nearest 4
  2704.   AND.b   #$03,d7 ; Mask off remainder bits
  2705.   BEQ     RoundUWskip`1
  2706.   ADDQ.w  #4,d1
  2707.   TST.w   d1 ; Has it accidentally become >signed word limit?
  2708.   BGT     RoundUWskip`1
  2709.   SUBQ.w  #4,d1 ; Can't have it rounded up, crop
  2710. RoundUWskip`1
  2711. End Macro
  2712.  
  2713. Macro RemakeStencil
  2714. ;Make/Remake stencil data from graphic data
  2715. ;`1=Label counter
  2716. ;a0=structure base. stencil memory already reserved.
  2717. ;Regs d0..d2/d4/d6/d7/a1/a2 preserved
  2718.   MOVEM.l d0-d2/d4/d6/d7/a1/a2,-(a7) ; Store
  2719.   JSR     InitialiseRegs
  2720.   LSR.w   #2,d0 ; Width/4 for longwords
  2721.   SUBQ.w  #1,d1 ; Height-1 for loop
  2722.   SUBQ.w  #1,d0 ; loopcounter
  2723. StencilLoop1`1
  2724.     MOVE.w  d0,d6 ; XLoop
  2725. StencilLoop2`1
  2726.       MOVE.b  (a1)+,d4 ; Get source byte1
  2727.       SEQ.b   d4
  2728.       LSL.w   #8,d4
  2729.       MOVE.b  (a1)+,d4 ; Get source byte2
  2730.       SEQ.b   d4
  2731.       SWAP    d4
  2732.       MOVE.b  (a1)+,d4 ; Get source byte3
  2733.       SEQ.b   d4
  2734.       LSL.w   #8,d4
  2735.       MOVE.b  (a1)+,d4 ; Get source byte4
  2736.       SEQ.b   d4
  2737.       MOVE.l  d4,(a2)+ ; Write mask longword
  2738.       DBRA    d6,StencilLoop2`1 ;XLoop
  2739.     ADD.w   d7,a1 ; Source data modulo
  2740.     ADD.w   d7,a2 ; Dest stencil modulo
  2741.     DBRA    d1,StencilLoop1`1 ;YLoop
  2742.   MOVEM.l (a7)+,d0-d2/d4/d6/d7/a1/a2
  2743. End Macro
  2744.  
  2745. Macro FreeStencilMem
  2746. ;Free's stencil memory.
  2747. ;`1=Label counter
  2748. ;a0=struct
  2749. ;trashes d0/a1
  2750.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Stencil mem already present?
  2751.   BEQ     FreeSMskip2`1
  2752.   TST.b   CRsrc_SHere-ChunkyResources(a0) ; Freeable?
  2753.   BEQ     FreeSMskip`1 ; No, skip dealloc
  2754.   ;Stencil needs freeing
  2755.   MOVE.l  CRsrc_SBytes-ChunkyResources(a0),d0 ; Size
  2756.   MOVE.l  CRsrc_SMem-ChunkyResources(a0),a1 ; Mem address
  2757.   ALibJsr #BlitzFreemem ; Free stencil memory
  2758. FreeSMskip`1
  2759.   !WriteDefaultStencilInfo{001}
  2760. FreeSMskip2`1
  2761. End Macro
  2762.  
  2763. Macro WriteDefaultStencilInfo
  2764. ;Init Stencil info
  2765.   MOVE.l  #0,CRsrc_Stencil-ChunkyResources(a0)
  2766.   MOVE.l  #0,CRsrc_SMem-ChunkyResources(a0)
  2767.   MOVE.l  #0,CRsrc_SBytes-ChunkyResources(a0)
  2768.   MOVE.b  #0,CRsrc_SHere-ChunkyResources(a0)
  2769. End Macro
  2770.  
  2771. Macro DuplicateResourceStruct
  2772. ;Duplicate without alteration all fields of a Resource
  2773. ;a0=Source struct
  2774. ;a1=Dest struct
  2775.   MOVE.w  CRsrc_Width-ChunkyResources(a0),CRsrc_Width-ChunkyResources(a1)
  2776.   MOVE.w  CRsrc_Height-ChunkyResources(a0),CRsrc_Height-ChunkyResources(a1)
  2777.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),CRsrc_LineMod-ChunkyResources(a1)
  2778.   MOVE.l  CRsrc_Data-ChunkyResources(a0),CRsrc_Data-ChunkyResources(a1)
  2779.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),CRsrc_Stencil-ChunkyResources(a1)
  2780.   MOVE.w  CRsrc_XHandle-ChunkyResources(a0),CRsrc_XHandle-ChunkyResources(a1)
  2781.   MOVE.w  CRsrc_YHandle-ChunkyResources(a0),CRsrc_YHandle-ChunkyResources(a1)
  2782.   MOVE.l  CRsrc_DMem-ChunkyResources(a0),CRsrc_DMem-ChunkyResources(a1)
  2783.   MOVE.l  CRsrc_DBytes-ChunkyResources(a0),CRsrc_DBytes-ChunkyResources(a1)
  2784.   MOVE.l  CRsrc_SMem-ChunkyResources(a0),CRsrc_SMem-ChunkyResources(a1)
  2785.   MOVE.l  CRsrc_SBytes-ChunkyResources(a0),CRsrc_SBytes-ChunkyResources(a1)
  2786.   MOVE.b  CRsrc_DHere-ChunkyResources(a0),CRsrc_DHere-ChunkyResources(a1)
  2787.   MOVE.b  CRsrc_SHere-ChunkyResources(a0),CRsrc_SHere-ChunkyResources(a1)
  2788.   MOVE.b  CRsrc_Clipping-ChunkyResources(a0),CRsrc_Clipping-ChunkyResources(a1)
  2789.   MOVE.b  CRsrc_Wrapping-ChunkyResources(a0),CRsrc_Wrapping-ChunkyResources(a1)
  2790.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),CRsrc_ClipLeft-ChunkyResources(a1)
  2791.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),CRsrc_ClipTop-ChunkyResources(a1)
  2792.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),CRsrc_ClipWidth-ChunkyResources(a1)
  2793.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),CRsrc_ClipHight-ChunkyResources(a1)
  2794.   MOVE.w  CRsrc_ClipLMod-ChunkyResources(a0),CRsrc_ClipLMod-ChunkyResources(a1)
  2795.   MOVE.l  CRsrc_ClipBytes-ChunkyResources(a0),CRsrc_ClipBytes-ChunkyResources(a1)
  2796.   MOVE.l  CRsrc_WrapBytes-ChunkyResources(a0),CRsrc_WrapBytes-ChunkyResources(a1)
  2797.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),CRsrc_TotWidth-ChunkyResources(a1)
  2798. End Macro
  2799.  
  2800. Macro CopyCShapeDat
  2801. ;Copy source shape struct to dest shape struct
  2802. ;`1=Label counter
  2803. ;d0=Source shape number
  2804. ;d1=Dest shape number
  2805. ;Returns shape structs in a0 and a1
  2806.   EXG.l   d0,d1
  2807.   !GetShapeObjectPtr ; Base in a0
  2808.   !DeallocResourceObject{014`1} ; Free destination if pre-existing
  2809.   EXG.l   d0,d1
  2810.   MOVE.l  a0,a1 ; Dest
  2811.   !GetShapeObjectPtr ; Base in a0 - Source
  2812.   !DuplicateResourceStruct
  2813.   MOVE.b  #0,CRsrc_DHere-ChunkyResources(a1) ; Cludged data
  2814.   MOVE.b  #0,CRsrc_SHere-ChunkyResources(a1) ; Cludged stencil
  2815. End Macro
  2816.  
  2817. Macro CopyCBitmapDat
  2818. ;Copy source bitmap struct to dest bitmap struct
  2819. ;`1=Label counter
  2820. ;d0=Source bitmap number
  2821. ;d1=Dest bitmap number
  2822. ;Returns bitmap structs in a0 and a1
  2823.   EXG.l   d0,d1
  2824.   !GetBitmapObjectPtr ; Base in a0
  2825.   !DeallocResourceObject{015`1} ; Free destination if pre-existing
  2826.   EXG.l   d0,d1
  2827.   MOVE.l  a0,a1 ; Dest
  2828.   !GetBitmapObjectPtr ; Base in a0 - Source
  2829.   !DuplicateResourceStruct
  2830.   MOVE.b  #0,CRsrc_DHere-ChunkyResources(a1) ; Cludged data
  2831.   MOVE.b  #0,CRsrc_SHere-ChunkyResources(a1) ; Cludged stencil
  2832. End Macro
  2833.  
  2834. Macro CopyCBitmapDatToCShape
  2835. ;Copy source bitmap struct to dest shape struct
  2836. ;`1=Label counter
  2837. ;d0=Source bitmap number
  2838. ;d1=Dest shape number
  2839. ;Returns bitmap struct in a0, shape struct in a1
  2840.   EXG.l   d0,d1
  2841.   !GetShapeObjectPtr ; Base in a0
  2842.   !DeallocResourceObject{016`1} ; Free destination if pre-existing
  2843.   EXG.l   d0,d1
  2844.   MOVE.l  a0,a1 ; Dest
  2845.   !GetBitmapObjectPtr ; Base in a0 - Source
  2846.   !DuplicateResourceStruct
  2847.   MOVE.b  #0,CRsrc_DHere-ChunkyResources(a1) ; Cludged data
  2848.   MOVE.b  #0,CRsrc_SHere-ChunkyResources(a1) ; Cludged stencil
  2849. End Macro
  2850.  
  2851. Macro CopyCShapeDatToCBitmap
  2852. ;Copy source shape struct to dest bitmap struct
  2853. ;`1=Label counter
  2854. ;d0=Source shape number
  2855. ;d1=Dest shape number
  2856. ;Returns shape struct in a0, bitmap structs in a1
  2857.   EXG.l   d0,d1
  2858.   !GetBitmapObjectPtr ; Base in a0
  2859.   !DeallocResourceObject{017`1} ; Free destination if pre-existing
  2860.   EXG.l   d0,d1
  2861.   MOVE.l  a0,a1 ; Dest
  2862.   !GetShapeObjectPtr ; Base in a0 - Source
  2863.   !DuplicateResourceStruct
  2864.   MOVE.b  #0,CRsrc_DHere-ChunkyResources(a1) ; Cludged data
  2865.   MOVE.b  #0,CRsrc_SHere-ChunkyResources(a1) ; Cludged stencil
  2866. End Macro
  2867.  
  2868. Macro WriteClipWindowData
  2869. ;Write new clip-window info to a resource struct
  2870. ;a0=struct base
  2871. ;d1=Rounded X
  2872. ;d2=Y
  2873. ;d3=Rounded Width
  2874. ;d4=Height
  2875. ;d5=Use status
  2876. ;Trashes d7
  2877.   MOVE.w  d1,CRsrc_ClipLeft-ChunkyResources(a0)
  2878.   MOVE.w  d2,CRsrc_ClipTop-ChunkyResources(a0)
  2879.   MOVE.w  d3,CRsrc_ClipWidth-ChunkyResources(a0)
  2880.   MOVE.w  d4,CRsrc_ClipHight-ChunkyResources(a0)
  2881.   MOVE.b  d5,CRsrc_Clipping-ChunkyResources(a0)
  2882.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d7
  2883.   SUB.w   d3,d7 ; Find clipping linemodulo
  2884.   MOVE.w  d7,CRsrc_ClipLMod-ChunkyResources(a0)
  2885.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d7 ; Get total width
  2886.   MULU    d2,d7 ; Find byte offset top left clip corner
  2887.   EXT.l   d1
  2888.   ADD.l   d1,d7
  2889.   MOVE.l  d7,CRsrc_ClipBytes-ChunkyResources(a0)
  2890. End Macro
  2891.  
  2892. Macro WriteDefaultClipData
  2893. ;Write data for default clipping, taken from dimensions of resource
  2894. ;a0=resource struct
  2895.   MOVE.w  #0,CRsrc_ClipLeft-ChunkyResources(a0)
  2896.   MOVE.w  #0,CRsrc_ClipTop-ChunkyResources(a0)
  2897.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d7
  2898.   MOVE.w  d7,d5 ; Store
  2899.   MOVE.w  d7,CRsrc_ClipWidth-ChunkyResources(a0)
  2900.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d6
  2901.   MOVE.w  d6,CRsrc_ClipHight-ChunkyResources(a0)
  2902.   MOVE.w  #0,CRsrc_ClipLMod-ChunkyResources(a0)
  2903.   MOVE.l  #0,CRsrc_ClipBytes-ChunkyResources(a0)
  2904. End Macro
  2905.  
  2906. Macro ShuffleRegs1
  2907. ;Register rearrangement and param rounding used in Scroll routines
  2908. ;`1=Label counter
  2909.   MOVE.l  d6,d7
  2910.   MOVE.l  d5,d6
  2911.   MOVE.l  d4,d5
  2912.   MOVE.l  d3,d4
  2913.   MOVE.l  d2,d3
  2914.   MOVE.l  d1,d2
  2915.   MOVE.l  d0,d1
  2916.   AND.b   #$FC,d3 ; Width down to nearest 4
  2917.   TST.w   d3
  2918.   BGT     ShuffleSkip`1
  2919.   MOVEQ.l #4,d3 ; Make sure width at least 4
  2920. ShuffleSkip`1
  2921. End Macro
  2922.  
  2923. Macro ShuffleRegs2
  2924. ;Register rearrangement used in GetaShape/GetaBitmap
  2925.   MOVE.l  d1,d0 ; X1
  2926.   MOVE.l  d2,d1 ; Y1
  2927.   MOVE.l  d3,d2 ; Width
  2928.   MOVE.l  d4,d3 ; Height
  2929.   MOVEQ.l #0,d4 ; X2
  2930.   MOVEQ.l #0,d5 ; Y2
  2931. End Macro
  2932.  
  2933. Macro ShuffleRegs3
  2934. ;Register rearrangement and param rounding used in BlockScroll routines
  2935.   MOVE.l  d6,d7
  2936.   MOVE.l  d5,d6
  2937.   MOVE.l  d4,d5
  2938.   MOVE.l  d3,d4
  2939.   MOVE.l  d2,d3
  2940.   MOVE.l  d1,d2
  2941.   MOVE.l  d0,d1
  2942.   AND.b   #$F0,d3 ; Width down to nearest 16
  2943.   TST.w   d3
  2944.   BGT     Shuffle3Skip`1
  2945.   MOVEQ.l #16,d3 ; Make sure width at least 16
  2946. Shuffle3Skip`1
  2947.   AND.b   #$F0,d1 ; X1 down to nearest 16
  2948.   AND.b   #$F0,d5 ; X2 down to nearest 16
  2949. End Macro
  2950.  
  2951. Macro ShuffleRegs4
  2952. ;Register rearrangement and NO param rounding used in Scroll routines
  2953. ;`1=Label counter
  2954.   MOVE.l  d6,d7
  2955.   MOVE.l  d5,d6
  2956.   MOVE.l  d4,d5
  2957.   MOVE.l  d3,d4
  2958.   MOVE.l  d2,d3
  2959.   MOVE.l  d1,d2
  2960.   MOVE.l  d0,d1
  2961.   TST.w   d3
  2962.   BGT     Shuffle4Skip`1
  2963.   MOVEQ.l #1,d3 ; Make sure width at least 1
  2964. Shuffle4Skip`1
  2965. End Macro
  2966.  
  2967. Macro _MScrollBitmapSetup
  2968. ;Routines shared in the scrolling
  2969.   !GetBitmapObjectPtr ; base in a0
  2970.   MOVE.l  a0,a1 ; Dest
  2971.   EXG.l   d7,d0
  2972.   !GetBitmapObjectPtr ; base in a0 - source
  2973.   EXG.l   d7,d0
  2974. End Macro
  2975.  
  2976. Macro _MScrollShapeSetup
  2977.   !GetShapeObjectPtr ; base in a0
  2978.   MOVE.l  a0,a1 ; Dest
  2979.   EXG.l   d7,d0
  2980.   !GetShapeObjectPtr ; base in a0 - source
  2981.   EXG.l   d7,d0
  2982. End Macro
  2983.  
  2984. Macro _MStenScrollSetup
  2985.   !GetBitmapObjectPtr ; base in a0
  2986.   MOVE.l  a0,a1 ; Dest
  2987.   EXG.l   d7,d0
  2988.   !GetBitmapObjectPtr ; base in a0 - source
  2989.   EXG.l   d7,d0
  2990. End Macro
  2991.  
  2992. Macro _MCookScrollSetup
  2993.   !GetShapeObjectPtr ; base in a0
  2994.   MOVE.l  a0,a1 ; Dest
  2995.   EXG.l   d7,d0
  2996.   !GetShapeObjectPtr ; base in a0 - source
  2997.   EXG.l   d7,d0
  2998. End Macro
  2999.  
  3000. Macro _MScrollBitmapToShapeSetup
  3001.   !GetShapeObjectPtr ; base in a0
  3002.   MOVE.l  a0,a1 ; Dest shape
  3003.   EXG.l   d7,d0
  3004.   !GetBitmapObjectPtr ; base in a0 - source bitmap
  3005.   EXG.l   d7,d0
  3006. End Macro
  3007.  
  3008. Macro _MScrollShapeToBitmapSetup
  3009.   !GetBitmapObjectPtr ; base in a0
  3010.   MOVE.l  a0,a1 ; Dest bitmap
  3011.   EXG.l   d7,d0
  3012.   !GetShapeObjectPtr ; base in a0 - source shape
  3013.   EXG.l   d7,d0
  3014. End Macro
  3015.  
  3016. Macro _MStenScrollBitmapToShapeSetup
  3017.   !GetShapeObjectPtr ; base in a0
  3018.   MOVE.l  a0,a1 ; Dest shape
  3019.   EXG.l   d7,d0
  3020.   !GetBitmapObjectPtr ; base in a0 - source bitmap
  3021.   EXG.l   d7,d0
  3022. End Macro
  3023.  
  3024. Macro _MCookScrollShapeToBitmapSetup
  3025.   !GetBitmapObjectPtr ; base in a0
  3026.   MOVE.l  a0,a1 ; Dest bitmap
  3027.   EXG.l   d7,d0
  3028.   !GetShapeObjectPtr ; base in a0 - source shape
  3029.   EXG.l   d7,d0
  3030. End Macro
  3031.  
  3032. Macro PerformPoint
  3033. ;Return pixel value
  3034. ;`1=Label counter
  3035. ;a0=Struct
  3036. ;a1=Data or Stencil/Cookie address
  3037. ;d1=Ypos
  3038. ;d2=Xpos
  3039. ;Trashes d7/a1
  3040. ;Returns d0=Pixel value
  3041.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  3042.   BEQ     PerfPointSkip`1
  3043.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1
  3044. PerfPointSkip`1
  3045.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d7
  3046.   ADD.w   d2,a1 ; x
  3047.   MULU    d1,d7
  3048.   ADD.l   d7,a1 ; y
  3049.   MOVEQ.l #0,d0 ; Init
  3050.   MOVE.b  (a1),d0 ; Get pixel
  3051. End Macro
  3052.  
  3053. Macro CludgeResourceWindow
  3054. ;Cludge a window within an existing resource's data
  3055. ;`1=Label counter
  3056. ;d0=Source resource number
  3057. ;d1=Dest resource number
  3058. ;d2=X left-edge coordinate in source
  3059. ;d3=Y top-edge coordinate in source
  3060. ;d4=Width of new window (smaller than source)
  3061. ;d5=Height of new window (smaller than source)
  3062. ;Trashes d0-d7
  3063. ;Returns address in d0 if success, or 0 if error
  3064.   EXT.l   d2 ;X
  3065.   EXT.l   d3 ;Y
  3066.   EXT.l   d4 ;Width
  3067.   EXT.l   d5 ;Height
  3068.   MOVE.l  d4,d1
  3069.   !RoundUpWidth{005`1} ; Make Width multiple of 4
  3070.   MOVE.l  d1,d4
  3071.   MOVE.l  d2,d1
  3072. ;  !RoundUpWidth{006`1} ; Make X multiple of 4
  3073.   MOVE.l  d1,d2
  3074.   MOVE.l  d4,d6 ; Store Width
  3075.   MOVE.l  d5,d7 ; Store Height
  3076.   TST.w   d2 ; Left-edge too far left?
  3077.   BLT     MakeRWindowSkip2`1
  3078.   CMP.w   CRsrc_Width-ChunkyResources(a1),d2 ; Left-edge too far right?
  3079.   BGE     MakeRWindowSkip2`1
  3080.   TST.w   d3 ; Top-edge too far up?
  3081.   BLT     MakeRWindowSkip2`1
  3082.   CMP.w   CRsrc_Height-ChunkyResources(a1),d3 ; Top edge too far down?
  3083.   BGE     MakeRWindowSkip2`1
  3084.   TST.w   d4 ; Width too small?
  3085.   BLE     MakeRWindowSkip2`1
  3086.   ADD.l   d2,d4
  3087.   CMP.w   CRsrc_Width-ChunkyResources(a1),d4 ; Window wider than source?
  3088.   BGT     MakeRWindowSkip2`1
  3089.   TST.w   d5 ; Height too small?
  3090.   BLE     MakeRWindowSkip2`1
  3091.   ADD.l   d3,d5
  3092.   CMP.w   CRsrc_Height-ChunkyResources(a1),d5 ; Window taller than source?
  3093.   BGT     MakeRWindowSkip2`1
  3094.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a1),d1 ; Get existing total width
  3095.   EXT.l   d1
  3096.   MOVE.w  d6,CRsrc_Width-ChunkyResources(a1) ; New width
  3097.   MOVE.w  d7,CRsrc_Height-ChunkyResources(a1) ; New height
  3098.   MOVE.l  d1,d4 ; Store original width
  3099.   MOVE.w  d1,CRsrc_TotWidth-ChunkyResources(a1) ; New TotWidth (original width)
  3100.   SUB.l   d6,d1 ; Work out new line modulo
  3101.   MOVE.w  d1,CRsrc_LineMod-ChunkyResources(a1) ; New line modulo
  3102.   MOVE.l  d3,d1 ; Store
  3103.   MULU    d4,d3 ; TotalWidth*Y for YOffset in bytes
  3104.   ADD.l   d2,d3 ; +X, d3=Byte offset of top left corner
  3105.   MOVE.l  CRsrc_Data-ChunkyResources(a1),d5 ; Get old data pointer
  3106.   ADD.l   d3,d5 ; New data pointer
  3107.   MOVE.l  d5,CRsrc_Data-ChunkyResources(a1)
  3108.   TST.l   CRsrc_SMem-ChunkyResources(a1)
  3109.   BEQ     MakeRWindowSkip1`1
  3110.   MOVE.l  CRsrc_Stencil-ChunkyResources(a1),d6 ; Get old stencil pointer
  3111.   ADD.l   d3,d6 ; New stencil pointer
  3112.   MOVE.l  d6,CRsrc_Stencil-ChunkyResources(a1)
  3113. MakeRWindowSkip1`1
  3114.   MOVE.l  d5,d0 ; Return success as data address
  3115.   ;Crop the clip window
  3116.   MOVE.w  d2,d5 ; Copy leftedge
  3117.   ADD.w   CRsrc_Width-ChunkyResources(a1),d5 ; Find window rightedge
  3118.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a1),d6 ; Copy leftedge
  3119.   ADD.w   CRsrc_ClipWidth-ChunkyResources(a1),d6 ; Find clip rightedge
  3120.   CMP.w   d6,d5
  3121.   BGT     MakeRWindowSkip6`1
  3122.   MOVE.w  d5,d6 ; New clip rightedge
  3123. MakeRWindowSkip6`1
  3124.   SUB.w   d2,d6 ; Find rightedge within window
  3125.   MOVE.w  d1,d5 ; Copy topedge
  3126.   ADD.w   CRsrc_Height-ChunkyResources(a1),d5 ; Find window bottomedge
  3127.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a1),d4 ; Copy topedge
  3128.   ADD.w   CRsrc_ClipHight-ChunkyResources(a1),d4 ; Find clip bottomedge
  3129.   CMP.w   d4,d5
  3130.   BGT     MakeRWindowSkip7`1
  3131.   MOVE.w  d5,d4 ; New clip bottomedge
  3132. MakeRWindowSkip7`1
  3133.   SUB.w   d1,d4 ; Find rightedge within window
  3134.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a1),d3 ; Get clipleft
  3135.   CMP.w   d2,d3
  3136.   BGE     MakeRWindowSkip4`1
  3137.   MOVE.w  d2,d3 ; New clip leftedge
  3138. MakeRWindowSkip4`1
  3139.   SUB.w   d2,d3 ; Find leftedge within window
  3140.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a1),d7 ; Get cliptop
  3141.   CMP.w   d1,d7
  3142.   BGE     MakeRWindowSkip5`1
  3143.   MOVE.w  d1,d7 ; New clip topedge
  3144. MakeRWindowSkip5`1
  3145.   SUB.w   d1,d7 ; Find topedge within window
  3146.   SUB.w   d3,d6 ; Find clip width
  3147.   SUB.w   d7,d4 ; Find clip height
  3148.   MOVE.w  d3,CRsrc_ClipLeft-ChunkyResources(a1)
  3149.   MOVE.w  d7,CRsrc_ClipTop-ChunkyResources(a1)
  3150.   MOVE.w  d6,CRsrc_ClipWidth-ChunkyResources(a1)
  3151.   MOVE.w  d4,CRsrc_ClipHight-ChunkyResources(a1)
  3152.   MOVE.w  CRsrc_Width-ChunkyResources(a1),d2
  3153.   SUB.w   d6,d2 ; Find linemod
  3154.   MOVE.w  d2,CRsrc_ClipLMod-ChunkyResources(a1)
  3155.   MOVE.w  CRsrc_Width-ChunkyResources(a1),d6 ; Get total width
  3156.   MULU    d7,d6 ; Find bytes
  3157.   EXT.l   d3
  3158.   ADD.l   d3,d6 ; Total bytes for top left clip corner
  3159.   MOVE.l  d6,CRsrc_ClipBytes-ChunkyResources(a1)
  3160.   BRA     MakeRWindowDone`1
  3161. MakeRWindowSkip2`1
  3162.   MOVE.l  #0,CRsrc_Width-ChunkyResources(a1) ; Wipe width and height to indicate dead structure
  3163.   MOVEQ.l #0,d0 ; Return error
  3164. MakeRWindowDone`1
  3165. End Macro
  3166.  
  3167. Macro PerformYFlip
  3168. ;Vertically flip an image
  3169. ;`1=Label counter
  3170. ;a1=address of topleft corner
  3171. ;d7=line modulo
  3172. ;d0=width
  3173. ;d1=height
  3174. ;Trashes many
  3175.   MOVE.w  d7,d5 ; Store linemod
  3176.   ADD.w   d0,d7 ; Total bytes in a line
  3177.   MOVE.w  d1,d2 ; Copy Height
  3178.   LSR.w   #1,d2 ; Height/2
  3179.   SUBQ.w  #1,d2 ; Y loopcounter
  3180.   SUBQ.w  #1,d1 ; -BottomLine
  3181.   MULU    d7,d1 ; Find start of last line
  3182.   ADD.l   a1,d1 ; Add base
  3183.   MOVE.l  d1,a2 ; Make address
  3184.   MOVE.w  d0,d6 ; Copy op width
  3185.   LSR.w   #2,d0 ; Width/4 for longwords
  3186.   MOVE.w  d0,d4 ; Copy Width/4
  3187.   AND.w   #$0003,d4 ; Find if Width/16
  3188.   BEQ     PerfYFlip_16`1 ; If a multiple of 16, do faster loop
  3189.   SUBQ.w  #1,d0 ; X loopcounter
  3190. PerfYFlipYLoop`1
  3191.     MOVE.w  d0,d3 ; XLoop
  3192. PerfYFlipXLoop`1
  3193.       MOVE.l  (a2),d4 ; Get bottom line
  3194.       MOVE.l  (a1),(a2)+ ; Copy top line
  3195.       MOVE.l  d4,(a1)+ ; Copy bottom line
  3196.       DBRA    d3,PerfYFlipXLoop`1
  3197.     ADD.w   d5,a1 ; Next top line
  3198.     SUB.w   d6,a2 ; Start of this bottom line
  3199.     SUB.w   d7,a2 ; Next bottom line
  3200.     DBRA    d2,PerfYFlipYLoop`1
  3201.   BRA   PerfYFlipDone`1
  3202. PerfYFlip_16`1
  3203.   LSR.w   #2,d0 ; Width/16
  3204.   SUBQ.w  #1,d0 ; X loopcounter
  3205. PerfYFlip_16YLoop`1
  3206.     MOVE.w  d0,d3 ; XLoop
  3207. PerfYFlip_16XLoop`1
  3208.       MOVE.l  (a2),d4 ; Get bottom line
  3209.       MOVE.l  (a1),(a2)+ ; Copy top line
  3210.       MOVE.l  d4,(a1)+ ; Copy bottom line
  3211.       MOVE.l  (a2),d4 ; Get bottom line
  3212.       MOVE.l  (a1),(a2)+ ; Copy top line
  3213.       MOVE.l  d4,(a1)+ ; Copy bottom line
  3214.       MOVE.l  (a2),d4 ; Get bottom line
  3215.       MOVE.l  (a1),(a2)+ ; Copy top line
  3216.       MOVE.l  d4,(a1)+ ; Copy bottom line
  3217.       MOVE.l  (a2),d4 ; Get bottom line
  3218.       MOVE.l  (a1),(a2)+ ; Copy top line
  3219.       MOVE.l  d4,(a1)+ ; Copy bottom line
  3220.       DBRA    d3,PerfYFlip_16XLoop`1
  3221.     ADD.w   d5,a1 ; Next top line
  3222.     SUB.w   d6,a2 ; Start of this bottom line
  3223.     SUB.w   d7,a2 ; Next bottom line
  3224.     DBRA    d2,PerfYFlip_16YLoop`1
  3225. PerfYFlipDone`1
  3226. End Macro
  3227.  
  3228. Macro PerformXFlip
  3229. ;Horizontally flip an image
  3230. ;`1=Label counter
  3231. ;a1=address of topleft corner
  3232. ;d7=line modulo
  3233. ;d0=width
  3234. ;d1=height
  3235. ;Trashes many
  3236.   ADD.w   d0,d7 ; Total bytes in a line
  3237.   MOVE.w  d0,d2 ; Copy Width
  3238.   MOVE.w  d2,d6 ; Copy Width
  3239.   LSR.w   #1,d2 ; Width/2 for bytes to do
  3240.   MOVE.w  d2,d5 ; Copy Width/2
  3241.   MOVE.l  a1,a2 ; Copy base
  3242.   ADD.w   d0,a2 ; Find end of line
  3243.   SUBQ.w  #1,d1 ; Y loopcounter
  3244.   AND.w   #$000F,d6 ; Width multiple of 16?
  3245.   BEQ     PerfXFlip_16`1
  3246. PerfXFlip_4`1
  3247.   LSR.w   #1,d2 ; Width/4 for 2bytes to do
  3248.   SUBQ.w  #1,d2 ; X loopcounter
  3249. PerfXFlip_4YLoop`1
  3250.     MOVE.w  d2,d3 ; XLoop
  3251. PerfXFlip_4XLoop`1
  3252.       MOVE.w  -(a2),d4
  3253.       ROL.w   #8,d4      ; swap 2 bytes for 2 bytes = 4
  3254.       MOVE.w  (a1),d6
  3255.       MOVE.w  d4,(a2)
  3256.       ROL.w   #8,d6
  3257.       MOVE.w  d6,(a1)+
  3258.       DBRA    d3,PerfXFlip_4XLoop`1
  3259.     SUB.w   d5,a1 ; Start of this line
  3260.     ADD.w   d7,a1 ; Start of next line
  3261.     ADD.w   d5,a2 ; End of this line
  3262.     ADD.w   d7,a2 ; End of next line
  3263.     DBRA    d1,PerfXFlip_4YLoop`1
  3264.   BRA   PerfXFlipDone`1
  3265. PerfXFlip_16`1
  3266.   LSR.w   #3,d2 ; Width/16 for 8bytes to do
  3267.   SUBQ.w  #1,d2 ; X loopcounter
  3268. PerfXFlip_16YLoop`1
  3269.     MOVE.w  d2,d3 ; XLoop
  3270. PerfXFlip_16XLoop`1
  3271.       MOVE.l  -(a2),d4
  3272.       ROL.w   #8,d4
  3273.       MOVE.l  (a1),d6
  3274.       SWAP    d4
  3275.       ROL.w   #8,d6
  3276.       ROL.w   #8,d4
  3277.       SWAP    d6
  3278.       MOVE.l  d4,(a2)
  3279.       ROL.w   #8,d6
  3280.       MOVE.l  d6,(a1)+   ; swap 8 bytes for 8 bytes = 16
  3281.       MOVE.l  -(a2),d4
  3282.       ROL.w   #8,d4
  3283.       MOVE.l  (a1),d6
  3284.       SWAP    d4
  3285.       ROL.w   #8,d6
  3286.       ROL.w   #8,d4
  3287.       SWAP    d6
  3288.       MOVE.l  d4,(a2)
  3289.       ROL.w   #8,d6
  3290.       MOVE.l  d6,(a1)+
  3291.       DBRA    d3,PerfXFlip_16XLoop`1
  3292.     SUB.w   d5,a1 ; Start of this line
  3293.     ADD.w   d7,a1 ; Start of next line
  3294.     ADD.w   d5,a2 ; End of this line
  3295.     ADD.w   d7,a2 ; End of next line
  3296.     DBRA    d1,PerfXFlip_16YLoop`1
  3297. PerfXFlipDone`1
  3298. End Macro
  3299.  
  3300. Macro PrepareCoords
  3301. ;Prepare coords so that X2,Y2 are always greater than X1,Y1
  3302. ;`1=Label counter
  3303. ;d0=X1
  3304. ;d1=Y1
  3305. ;d2=X2
  3306. ;d3=Y2
  3307. ;Outputs: d0=Smallest X, d1=SmallestY, d2=LargestX, d3=LargestY
  3308.   CMP.w   d0,d2 ; X2 smaller?
  3309.   BGE     PrepCoordsSkip1`1 ; no
  3310.   EXG.l   d0,d2 ; yes
  3311. PrepCoordsSkip1`1
  3312.   CMP.w   d1,d3 ; Y2 smaller?
  3313.   BGE     PrepCoordsSkip2`1 ; no
  3314.   EXG.l   d1,d3 ; yes
  3315. PrepCoordsSkip2`1
  3316. End Macro
  3317.  
  3318. Macro PrepareXCoords
  3319. ;Prepare coords so that X2 is always greater X1
  3320. ;`1=Label counter
  3321. ;d0=X1
  3322. ;d2=X2
  3323. ;Outputs: d0=Smallest X, d2=LargestX
  3324.   CMP.w   d0,d2 ; X2 smaller?
  3325.   BGE     PrepXCoordsSkip1`1 ; no
  3326.   EXG.l   d0,d2 ; yes
  3327. PrepXCoordsSkip1`1
  3328. End Macro
  3329.  
  3330. Macro PrepareYCoords
  3331. ;Prepare coords so that Y2 is always greater Y1
  3332. ;`1=Label counter
  3333. ;d1=Y1
  3334. ;d3=Y2
  3335. ;Outputs: d1=Smallest Y, d3=LargestY
  3336.   CMP.w   d1,d3 ; Y2 smaller?
  3337.   BGE     PrepYCoordsSkip1`1 ; no
  3338.   EXG.l   d1,d3 ; yes
  3339. PrepYCoordsSkip1`1
  3340. End Macro
  3341.  
  3342. ;**-Common-Check-Macros-**************************************************************
  3343. .CommonCheckMacros
  3344.  
  3345. Macro CCheckXYFits
  3346. ;Checks shared by Plot routines
  3347.   TST.w   d0
  3348.   BLT     Error39 ; X too small
  3349.   CMP.w   CRsrc_Width-ChunkyResources(a0),d0
  3350.   BGE     Error39 ; X too large
  3351.   TST.w   d1
  3352.   BLT     Error40 ; Y too small
  3353.   CMP.w   CRsrc_Height-ChunkyResources(a0),d1
  3354.   BGE     Error40 ; Y too large
  3355. End Macro
  3356.  
  3357. Macro CCheckXYFits2
  3358. ;Checks shared by Plot routines
  3359.   TST.w   d6
  3360.   BLT     Error39 ; X too small
  3361.   CMP.w   CRsrc_Width-ChunkyResources(a0),d6
  3362.   BGE     Error39 ; X too large
  3363.   TST.w   d7
  3364.   BLT     Error40 ; Y too small
  3365.   CMP.w   CRsrc_Height-ChunkyResources(a0),d7
  3366.   BGE     Error40 ; Y too large
  3367. End Macro
  3368.  
  3369. Macro CCheckXYFits3
  3370. ;Checks shared by Plot routines
  3371.   TST.w   d4
  3372.   BLT     Error39 ; X too small
  3373.   CMP.w   CRsrc_Width-ChunkyResources(a0),d4
  3374.   BGE     Error39 ; X too large
  3375.   TST.w   d5
  3376.   BLT     Error40 ; Y too small
  3377.   CMP.w   CRsrc_Height-ChunkyResources(a0),d5
  3378.   BGE     Error40 ; Y too large
  3379. End Macro
  3380.  
  3381. Macro CCheckSharedScroll
  3382. ;Scroll-related partial check shared by a few tokens
  3383.   MOVE.l  a1,d0 ; Restore
  3384.   MOVE.l  d6,a1 ; Store
  3385.   !CCheckWindowFits3
  3386.   MOVE.l  a1,d6 ; Restore
  3387.   MOVE.l  d0,a1 ; Store
  3388.   MOVE.w  CurrentChunkyBitmap1,d0
  3389.   BLT     Error28
  3390.   !CThreeBitmapChecks
  3391.   !GetBitmapObjectPtr ; Base in a0
  3392.   MOVE.l  a1,d0 ; Restore
  3393.   MOVE.l  d6,a1 ; Store
  3394.   MOVEM.l d0/d1,-(a7) ; Store
  3395.   MOVE.l  d4,d0 ; X2
  3396.   MOVE.l  d5,d1 ; Y2
  3397.   !CCheckWindowFits3
  3398.   MOVEM.l (a7)+,d0/d1 ; Restore
  3399.   MOVE.l  a1,d6 ; Restore
  3400. End Macro
  3401.  
  3402. Macro CCheckSharedScrollShape
  3403. ;Scroll-related shape-oriented partial check shared by a few tokens
  3404.   MOVE.l  a1,d0 ; Restore
  3405.   MOVE.l  d6,a1 ; Store
  3406.   !CCheckWindowFits3
  3407.   MOVE.l  a1,d6 ; Restore
  3408.   MOVE.l  d0,a1 ; Store
  3409.   MOVE.w  CurrentChunkyShape1,d0
  3410.   BLT     Error27
  3411.   !CThreeShapeChecks
  3412.   !GetShapeObjectPtr ; Base in a0
  3413.   MOVE.l  a1,d0 ; Restore
  3414.   MOVE.l  d6,a1 ; Store
  3415.   MOVEM.l d0/d1,-(a7) ; Store
  3416.   MOVE.l  d4,d0 ; X2
  3417.   MOVE.l  d5,d1 ; Y2
  3418.   !CCheckWindowFits3
  3419.   MOVEM.l (a7)+,d0/d1 ; Restore
  3420.   MOVE.l  a1,d6 ; Restore
  3421. End Macro
  3422.  
  3423. Macro CCheckSharedStenScroll
  3424. ;Scroll-related stencil-based check shared by a few tokens
  3425.   MOVE.l  d0,a1 ; Store
  3426.   MOVE.l  d6,d0
  3427.   !CThreeBitmapChecks
  3428.   !GetBitmapObjectPtr ; Base in a0
  3429.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Source has stencil?
  3430.   BEQ     Error33
  3431.   MOVE.l  a1,d0 ; Restore
  3432.   MOVE.l  d6,a1 ; Store
  3433.   !CCheckWindowFits3
  3434.   MOVE.l  a1,d6 ; Restore
  3435.   MOVE.l  d0,a1 ; Store
  3436.   MOVE.w  CurrentChunkyBitmap1,d0
  3437.   BLT     Error28
  3438.   !CThreeBitmapChecks
  3439.   !GetBitmapObjectPtr ; Base in a0
  3440.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Dest has stencil?
  3441.   BEQ     Error34
  3442.   MOVE.l  a1,d0 ; Restore
  3443.   MOVE.l  d6,a1 ; Store
  3444.   MOVEM.l d0/d1,-(a7) ; Store
  3445.   MOVE.l  d4,d0 ; X2
  3446.   MOVE.l  d5,d1 ; Y2
  3447.   !CCheckWindowFits3
  3448.   MOVEM.l (a7)+,d0/d1 ; Restore
  3449.   MOVE.l  a1,d6 ; Restore
  3450. End Macro
  3451.  
  3452. Macro CCheckSharedCookScroll
  3453. ;Scroll-related cookie-based check shared by a few tokens
  3454.   MOVE.l  d0,a1 ; Store
  3455.   MOVE.l  d6,d0
  3456.   !CThreeShapeChecks
  3457.   !GetShapeObjectPtr ; Base in a0
  3458.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Source has cookie?
  3459.   BEQ     Error31
  3460.   MOVE.l  a1,d0 ; Restore
  3461.   MOVE.l  d6,a1 ; Store
  3462.   !CCheckWindowFits3
  3463.   MOVE.l  a1,d6 ; Restore
  3464.   MOVE.l  d0,a1 ; Store
  3465.   MOVE.w  CurrentChunkyShape1,d0
  3466.   BLT     Error27
  3467.   !CThreeShapeChecks
  3468.   !GetShapeObjectPtr ; Base in a0
  3469.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Dest has cookie?
  3470.   BEQ     Error32
  3471.   MOVE.l  a1,d0 ; Restore
  3472.   MOVE.l  d6,a1 ; Store
  3473.   MOVEM.l d0/d1,-(a7) ; Store
  3474.   MOVE.l  d4,d0 ; X2
  3475.   MOVE.l  d5,d1 ; Y2
  3476.   !CCheckWindowFits3
  3477.   MOVEM.l (a7)+,d0/d1 ; Restore
  3478.   MOVE.l  a1,d6 ; Restore
  3479. End Macro
  3480.  
  3481. Macro CCheckWindowFits
  3482. ;Check requested window size fits within existing size
  3483. ;Trashes d6/d7/a0
  3484. ;X/Y/Width/Height are d2/d3/d4/d5
  3485.   MOVE.w  d4,d6 ; Copy Width
  3486.   MOVE.w  d5,d7 ; Copy Height
  3487.   TST.w   d2 ; Left-edge too far left?
  3488.   BLT     Error39
  3489.   CMP.w   CRsrc_Width-ChunkyResources(a0),d2 ; Left-edge too far right?
  3490.   BGE     Error39
  3491.   TST.w   d3 ; Top-edge too far up?
  3492.   BLT     Error40
  3493.   CMP.w   CRsrc_Height-ChunkyResources(a0),d3 ; Top edge too far down?
  3494.   BGE     Error40
  3495.   TST.w   d4 ; Width too small?
  3496.   BLE     Error41
  3497.   ADD.w   d2,d6
  3498.   CMP.w   CRsrc_Width-ChunkyResources(a0),d6 ; Window wider than source?
  3499.   BGT     Error42
  3500.   TST.w   d5 ; Height too small?
  3501.   BLE     Error43
  3502.   ADD.w   d3,d7
  3503.   CMP.w   CRsrc_Height-ChunkyResources(a0),d7 ; Window taller than source?
  3504.   BGT     Error44
  3505. End Macro
  3506.  
  3507. Macro CCheckWindowFits2
  3508. ;Check requested window size fits within existing size
  3509. ;Trashes d6/d7/a0
  3510. ;X/Y/Width/Height are d1/d2/d3/d4
  3511.   MOVE.w  d3,d6 ; Copy Width
  3512.   MOVE.w  d4,d7 ; Copy Height
  3513.   TST.w   d1 ; Left-edge too far left?
  3514.   BLT     Error39
  3515.   CMP.w   CRsrc_Width-ChunkyResources(a0),d1 ; Left-edge too far right?
  3516.   BGE     Error39
  3517.   TST.w   d2 ; Top-edge too far up?
  3518.   BLT     Error40
  3519.   CMP.w   CRsrc_Height-ChunkyResources(a0),d2 ; Top edge too far down?
  3520.   BGE     Error40
  3521.   TST.w   d3 ; Width too small?
  3522.   BLE     Error41
  3523.   ADD.w   d1,d6
  3524.   CMP.w   CRsrc_Width-ChunkyResources(a0),d6 ; Window wider than source?
  3525.   BGT     Error42
  3526.   TST.w   d4 ; Height too small?
  3527.   BLE     Error43
  3528.   ADD.w   d2,d7
  3529.   CMP.w   CRsrc_Height-ChunkyResources(a0),d7 ; Window taller than source?
  3530.   BGT     Error44
  3531. End Macro
  3532.  
  3533. Macro CCheckWindowFits3
  3534. ;Check requested window size fits within existing size
  3535. ;Trashes d6/d7/a0
  3536. ;X/Y/Width/Height are d0/d1/d2/d3
  3537.   MOVE.w  d2,d6 ; Copy Width
  3538.   MOVE.w  d3,d7 ; Copy Height
  3539.   TST.w   d0 ; Left-edge too far left?
  3540.   BLT     Error39
  3541.   CMP.w   CRsrc_Width-ChunkyResources(a0),d0 ; Left-edge too far right?
  3542.   BGE     Error39
  3543.   TST.w   d1 ; Top-edge too far up?
  3544.   BLT     Error40
  3545.   CMP.w   CRsrc_Height-ChunkyResources(a0),d1 ; Top edge too far down?
  3546.   BGE     Error40
  3547.   TST.w   d2 ; Width too small?
  3548.   BLE     Error41
  3549.   ADD.w   d0,d6
  3550.   CMP.w   CRsrc_Width-ChunkyResources(a0),d6 ; Window wider than source?
  3551.   BGT     Error42
  3552.   TST.w   d3 ; Height too small?
  3553.   BLE     Error43
  3554.   ADD.w   d1,d7
  3555.   CMP.w   CRsrc_Height-ChunkyResources(a0),d7 ; Window taller than source?
  3556.   BGT     Error44
  3557. End Macro
  3558.  
  3559. Macro CCheckWindowFits4
  3560. ;Check requested coords fit within existing dimensions
  3561. ;X1/Y1/X2/Y2 are d0/d1/d2/d3 (uses X2,Y2 instead of width,height)
  3562.   TST.w   d0 ; X1 too far left?
  3563.   BLT     Error67
  3564.   CMP.w   CRsrc_Width-ChunkyResources(a0),d0 ; X1 too far right?
  3565.   BGE     Error67
  3566.   TST.w   d1 ; Y1 too far up?
  3567.   BLT     Error68
  3568.   CMP.w   CRsrc_Height-ChunkyResources(a0),d1 ; Y1 too far down?
  3569.   BGE     Error68
  3570.   TST.w   d2 ; X2 too far left?
  3571.   BLT     Error69
  3572.   CMP.w   CRsrc_Width-ChunkyResources(a0),d2 ; X2 too far right?
  3573.   BGT     Error69
  3574.   TST.w   d3 ; Y2 too far up?
  3575.   BLT     Error70
  3576.   CMP.w   CRsrc_Height-ChunkyResources(a0),d3 ; Y2 too far down?
  3577.   BGT     Error70
  3578. End Macro
  3579.  
  3580. Macro CThreec2pWindowChecks
  3581. ;Three commonly used checks for c2pWindow commands
  3582.   !CCheckc2pWindowsExist
  3583.   !CCheckc2pWindowNum
  3584.   !CCheckc2pWindowNumExists
  3585. End Macro
  3586.  
  3587. Macro CThreeShapeChecks
  3588. ;Three commonly used checks for shape commands
  3589.   !CCheckChunkyShapesExist
  3590.   !CCheckChunkyShapeNum
  3591.   !CCheckChunkyShapeNumExists
  3592. End Macro
  3593.  
  3594. Macro CThreeBitmapChecks
  3595. ;Three commonly used checks for bitmaps commands
  3596.   !CCheckChunkyBitmapsExist
  3597.   !CCheckChunkyBitmapNum
  3598.   !CCheckChunkyBitmapNumExists
  3599. End Macro
  3600.  
  3601. Macro CThreeQueueChecks
  3602. ;Three commonly used checks for queue commands
  3603.   !CCheckChunkyQueuesExist
  3604.   !CCheckChunkyQueueNum
  3605.   !CCheckChunkyQueueNumExists
  3606. End Macro
  3607.  
  3608. Macro CThreeTableChecks
  3609. ;Three commonly used checks for table commands
  3610.   !CCheckChunkyTablesExist
  3611.   !CCheckChunkyTableNum
  3612.   !CCheckChunkyTableNumExists
  3613. End Macro
  3614.  
  3615. Macro CCheckc2pWindowNum
  3616. ;Check that c2pWindow number is in valid range
  3617.   TST.w   d0
  3618.   BLT     Error0 ; Too small
  3619.   CMP.w   c2pWindowsTotal,d0
  3620.   BGE     Error0 ; Too large
  3621. End Macro
  3622.  
  3623. Macro CCheckc2pWindowsExist
  3624. ;Check that memory has been allocated for c2pWindow objects
  3625.   TST.l   c2pWindowsMem ; Exist?
  3626.   BEQ     Error16 ; No, error
  3627. End Macro
  3628.  
  3629. Macro CCheckc2pWindowNumExists
  3630. ;Check that a given c2pWindow object exists
  3631.   !Getc2pWindowObjectPtr ; Base into a0
  3632.   TST.l   c2p0_Pixels-c2pWindows(a0) ; Test Pixels and RowsStore
  3633.   BEQ     Error17 ; Doesn't exist
  3634. End Macro
  3635.  
  3636. Macro CCheckWordParam
  3637. ;Check that d0 word parameter is valid (not negative)
  3638.   TST.w   d0
  3639.   BLT     Error18
  3640. End Macro
  3641.  
  3642. Macro CCheckWordParam2
  3643. ;Check that d0 word parameter is valid (not negative, and also greater than 0)
  3644.   TST.w   d0
  3645.   BLE     Error25
  3646. End Macro
  3647.  
  3648. Macro CCheckChunkyBitmapsExist
  3649. ;Check that memory has been allocated for ChunkyBitmap objects
  3650.   TST.l   ChunkyBitmapsMem ; Exist?
  3651.   BEQ     Error19 ; No, error
  3652. End Macro
  3653.  
  3654. Macro CCheckChunkyBitmapNum
  3655. ;Check that ChunkyWindow number is in valid range
  3656.   TST.w   d0
  3657.   BLT     Error20 ; Too small
  3658.   CMP.w   ChunkyBitmapsTotal,d0
  3659.   BGE     Error20 ; Too large
  3660. End Macro
  3661.  
  3662. Macro CCheckChunkyBitmapNumExists
  3663. ;Check that given ChunkyBitmap object exists
  3664.   MOVE.w  d0,d7
  3665.   EXT.l   d7
  3666.   LSL.l   #ChunkyResourceStructSize,d7
  3667.   MOVE.l  ChunkyBitmapsMem,a0
  3668.   ADD.l   d7,a0
  3669.   TST.l   CRsrc_Width-ChunkyResources(a0) ; Test Width and Height
  3670.   BEQ     Error21 ; Doesn't exist
  3671. End Macro
  3672.  
  3673. Macro CCheckChunkyShapesExist
  3674. ;Check that memory has been allocated for ChunkyShape objects
  3675.   TST.l   ChunkyShapesMem ; Exist?
  3676.   BEQ     Error22 ; No, error
  3677. End Macro
  3678.  
  3679. Macro CCheckChunkyShapeNum
  3680. ;Check that ChunkyShape number is in valid range
  3681.   TST.w   d0
  3682.   BLT     Error23 ; Too small
  3683.   CMP.w   ChunkyShapesTotal,d0
  3684.   BGE     Error23 ; Too large
  3685. End Macro
  3686.  
  3687. Macro CCheckChunkyShapeNumExists
  3688. ;Check that given ChunkyShape object exists
  3689.   MOVE.w  d0,d7
  3690.   EXT.l   d7
  3691.   LSL.l   #ChunkyResourceStructSize,d7
  3692.   MOVE.l  ChunkyShapesMem,a0
  3693.   ADD.l   d7,a0
  3694.   TST.l   CRsrc_Width-ChunkyResources(a0) ; Test Width and Height
  3695.   BEQ     Error24 ; Doesn't exist
  3696. End Macro
  3697.  
  3698. Macro CCheckChunkyQueuesExist
  3699. ;Check that memory has been allocated for ChunkyQueue objects
  3700.   TST.l   ChunkyQueuesMem ; Exist?
  3701.   BEQ     Error57 ; No, error
  3702. End Macro
  3703.  
  3704. Macro CCheckChunkyQueueNum
  3705. ;Check that ChunkyQueue number is in valid range
  3706.   TST.w   d0
  3707.   BLT     Error58 ; Too small
  3708.   CMP.w   ChunkyQueuesTotal,d0
  3709.   BGE     Error58 ; Too large
  3710. End Macro
  3711.  
  3712. Macro CCheckChunkyQueueNumExists
  3713. ;Check that given ChunkyQueue object exists
  3714.   MOVE.w  d0,d7
  3715.   EXT.l   d7
  3716.   LSL.l   #ChunkyQueueStructSize,d7
  3717.   MOVE.l  ChunkyQueuesMem,a0
  3718.   ADD.l   d7,a0
  3719.   TST.l   CQueue_LMem-ChunkyQueues(a0) ; Test list memory
  3720.   BEQ     Error59 ; Doesn't exist
  3721. End Macro
  3722.  
  3723. Macro CCheckChunkyTablesExist
  3724. ;Check that memory has been allocated for ChunkyTable objects
  3725.   TST.l   ChunkyTablesMem ; Exist?
  3726.   BEQ     Error73 ; No, error
  3727. End Macro
  3728.  
  3729. Macro CCheckChunkyTableNum
  3730. ;Check that ChunkyTable number is in valid range
  3731.   TST.w   d0
  3732.   BLT     Error74 ; Too small
  3733.   CMP.w   ChunkyTablesTotal,d0
  3734.   BGE     Error74 ; Too large
  3735. End Macro
  3736.  
  3737. Macro CCheckChunkyTableNumExists
  3738. ;Check that given ChunkyTable object exists
  3739.   MOVE.w  d0,d7
  3740.   EXT.l   d7
  3741.   LSL.l   #ChunkyTableStructSize,d7
  3742.   MOVE.l  ChunkyTablesMem,a0
  3743.   ADD.l   d7,a0
  3744.   TST.l   CTable_LMem-ChunkyTables(a0) ; Test list memory
  3745.   BEQ     Error75 ; Doesn't exist
  3746. End Macro
  3747.  
  3748. ;**-Routines-*************************************************************************
  3749.  
  3750. .Initialise
  3751. ;Prepare included data that may have been modified in previous runs
  3752.   JSR     _MProcessor ; Find cpu
  3753.   BSR     _MCPU ; Set default general cpu
  3754.   BSR     _Mc2pCPUmode ; Set default cpu for c2p
  3755.   MOVE.l  #0,c2pWindowsMem
  3756.   MOVE.l  #0,ChunkyShapesMem
  3757.   MOVE.l  #0,ChunkyBitmapsMem
  3758.   MOVE.l  #0,ChunkyQueuesMem
  3759.   LEA     ChunkyShapeBanks,a0
  3760.   MOVEQ.l #NumberOfShapeBanks-1,d0
  3761.   MOVEQ.l #0,d1
  3762. InitClrLoop
  3763.   MOVE.l  d1,(a0)+
  3764.   MOVE.l  d1,(a0)+
  3765.   DBRA    d0,InitClrLoop
  3766.   MOVE.b  #-1,CShape_AutoCookie
  3767.   MOVE.b  #0,CBitmap_AutoStencil
  3768.   MOVE.b  #0,CShape_AutoClip
  3769.   MOVE.b  #0,CBitmap_AutoClip
  3770.   MOVE.b  #0,CShape_AutoWrap
  3771.   MOVE.b  #0,CBitmap_AutoWrap
  3772.   MOVE.b  #-1,CCookie_AutoXFlip
  3773.   MOVE.b  #-1,CCookie_AutoYFlip
  3774.   MOVE.b  #-1,CStencil_AutoXFlip
  3775.   MOVE.b  #-1,CStencil_AutoYFlip
  3776.   MOVE.w  #-1,Currentc2pWindow1
  3777.   MOVE.w  #-1,Currentc2pWindow2
  3778.   MOVE.w  #-1,Currentc2pWindow3
  3779.   MOVE.w  #-1,CurrentChunkyShape1
  3780.   MOVE.w  #-1,CurrentChunkyShape2
  3781.   MOVE.w  #-1,CurrentChunkyShape3
  3782.   MOVE.w  #-1,CurrentChunkyBitmap1
  3783.   MOVE.w  #-1,CurrentChunkyBitmap2
  3784.   MOVE.w  #-1,CurrentChunkyBitmap3
  3785.   MOVE.w  #-1,CurrentChunkyQueue1
  3786.   MOVE.w  #-1,CurrentChunkyQueue2
  3787.   MOVE.w  #-1,CurrentChunkyQueue3
  3788.   MOVE.w  #-1,CurrentChunkyTable1
  3789.   MOVE.w  #-1,CurrentChunkyTable2
  3790.   MOVE.w  #-1,CurrentChunkyTable3
  3791.   MOVE.b  #-1,Autoc2pWindowsUse
  3792.   MOVE.b  #-1,AutoChunkyShapesUse
  3793.   MOVE.b  #-1,AutoChunkyBitmapsUse
  3794.   MOVE.b  #-1,AutoChunkyQueuesUse
  3795.   MOVE.b  #-1,AutoChunkyTablesUse
  3796.   MOVE.b  #0,DoubleScrollMode
  3797.   MOVE.b  #0,DoubleQBlitMode
  3798.   MOVE.b  #0,DoubleBlitMode
  3799.   MOVE.w  #0,SScrollModeType
  3800.   MOVE.w  #0,SMaskScrollModeType
  3801.   MOVE.w  #0,_DoubleQBlitModeType
  3802.   MOVE.w  #0,_DoubleBlitModeType
  3803.   MOVE.w  #0,_BlitModeType
  3804.   MOVE.w  #4,_ParticleModeType
  3805.   MOVE.w  #4,_DrawingModeType
  3806. ;Make default amounts of objects
  3807.   MOVEQ.l #20,d0 ; 20 c2p Windows
  3808.   BSR     _MReservec2pWindows
  3809.   MOVEQ.l #20,d0 ; 20 Bitmaps
  3810.   BSR     _MReserveBitmaps
  3811.   MOVEQ.l #100,d0 ; 100 Shapes
  3812.   BSR     _MReserveShapes
  3813.   MOVEQ.l #20,d0 ; 20 Queues
  3814.   BSR     _MReserveQueues
  3815.   MOVEQ.l #20,d0 ; 20 Tables
  3816.   BSR     _MReserveTables
  3817. ;Return value for other libs to access
  3818.   LEA     _Data,a0
  3819.   MOVE.l  a0,d0 ; Return internal data area address
  3820.   RTS
  3821.  
  3822. ;*************************************************************************************
  3823.  
  3824. .FinishUp
  3825.   RTS
  3826.  
  3827. ;*************************************************************************************
  3828.  
  3829. _MNothing
  3830.   ; This is the 128th token. Do nothing, as it doesn't work.
  3831.   ; Also used for temporary tokens 1-5.
  3832.   RTS
  3833.  
  3834. ;*************************************************************************************
  3835.  
  3836. _Mc2pCPUmode
  3837. ;Set the cpu that the c2p is going to use, as there are 030- and 040+ routines
  3838. ;Note that this setting is overridden by M040c2p's setting
  3839.   CMP.b   #4,d0 ; Check for 040
  3840.   BLT     _Mc2pCPUmode030
  3841.   MOVE.b  #1,c2pCPUmode
  3842.   RTS
  3843. _Mc2pCPUmode030
  3844.   MOVE.b  #0,c2pCPUmode
  3845.   RTS
  3846.  
  3847. ;*************************************************************************************
  3848.  
  3849. _Mc2pWindowBriefShort
  3850.   MOVE.l  d1,d3
  3851.   MOVE.l  d1,d5
  3852.   MOVE.l  d2,d6
  3853.   MOVE.b  c2pCPUmode,d4
  3854.   LSL.b   #2,d4 ; Reverse engineeer cpu number
  3855.   BRA     _Mc2pWindow
  3856. _Mc2pWindowBrief
  3857.   MOVE.l  d3,d4
  3858.   MOVE.l  d1,d3
  3859.   MOVE.l  d1,d5
  3860.   MOVE.l  d2,d6
  3861.   BRA     _Mc2pWindow
  3862. _Mc2pWindowShort
  3863.   MOVE.l  d5,d6
  3864.   MOVE.l  d4,d5
  3865.   MOVE.b  c2pCPUmode,d4
  3866.   LSL.b   #2,d4 ; Reverse engineer cpu number
  3867. _Mc2pWindow
  3868. ;Initialises Chunky-To-planar, also self-modifies code To alter #planesize
  3869. ;Note that Planar YOffset has been removed.
  3870. ;d0.w=c2pWindow number
  3871. ;d1.w=Chunky operation width (window width)
  3872. ;d2.w=Chunky operation height (window height)
  3873. ;d3.w=Source width (length of a line in the whole chunky buffer, not a window)
  3874. ;d4.b=Processor (blitz instruction, will be 0/1/2/3/4)
  3875. ;d5.w=Planar width (full width of bitmap)
  3876. ;d6.w=Planar height (full height of bitmap)
  3877.   CMP.b   #4,d4 ; 040+?
  3878.   BLT     _Mc2pWindowlowCPU2
  3879.   MOVE.b  #1,c2pCPUmode
  3880.   BRA     _Mc2pWindowskip2
  3881. _Mc2pWindowlowCPU2
  3882.   MOVE.b  #0,c2pCPUmode
  3883. _Mc2pWindowskip2
  3884.   AND.l   #$FFFF,d0
  3885.   !Getc2pWindowObjectPtr ; Get base into a0
  3886.   AND.l   #$FFFF,d1
  3887.   AND.l   #$FFFF,d2
  3888.   TST.b   Autoc2pWindowsUse ; Use it?
  3889.   BEQ     _Mc2pWindowDontUse ; No
  3890.   MOVE.w  d0,Currentc2pWindow1 ; Yes, store c2pWindow number in current
  3891. _Mc2pWindowDontUse
  3892.   AND.l   #$FFFF,d3
  3893.   AND.l   #$FFFF,d5
  3894.   AND.l   #$FFFF,d6
  3895.   MOVE.l  d3,d7 ;temp
  3896.   SUB.l   d1,d3
  3897.   MOVE.l  d5,d7 ; store
  3898.   SUB.l   d1,d5
  3899.   LSR.l   #3,d5
  3900.   MOVE.w  d5,c2p0_Pmod-c2pWindows(a0) ; Horizontal Planar modulo in bytes
  3901.   BEQ     _Mc2pWindowskip3
  3902.   MOVE.w  d3,c2p0_Cmod-c2pWindows(a0) ; Source chunky modulo in bytes and pixels (same)
  3903.   MOVE.w  d1,c2p0_Pixels-c2pWindows(a0) ; Pixels per row chunky
  3904.   SUBQ.l  #1,d2 ; loopcounter
  3905.   MOVE.w  d2,c2p0_RowsStore-c2pWindows(a0) ; Chunky rows (loopcounter)
  3906.   BRA     _Mc2pWindowskip5
  3907. _Mc2pWindowskip3
  3908.   MOVE.w  d3,c2p0_Cmod-c2pWindows(a0) ; Source chunky modulo in bytes and pixels (same)
  3909.   BEQ     _Mc2pWindowskip4
  3910.   MOVE.w  d1,c2p0_Pixels-c2pWindows(a0) ; Pixels per row chunky
  3911.   SUBQ.l  #1,d2 ; loopcounter
  3912.   MOVE.w  d2,c2p0_RowsStore-c2pWindows(a0) ; Chunky rows (loopcounter)
  3913.   BRA     _Mc2pWindowskip5
  3914. _Mc2pWindowskip4
  3915.   MULU    d2,d1 ; Height*Width for longword Pixels.l for use with no linemodulo
  3916.   MOVE.l  d1,c2p0_Pixels-c2pWindows(a0) ; Pixels in total chunky (overwrites c2p0_RowsStore)
  3917. _Mc2pWindowskip5
  3918.   ;SMC, #PlaneSize
  3919.   MULU    d6,d7
  3920.   LSR.l   #3,d7 ; PlaneSize
  3921.   MOVE.l  d7,_Mc2pSMC001-4 ;-)                    SELF MODIFYING CODE! ;-)
  3922.   MOVE.l  d7,_Mc2pSMC011-4
  3923.   MOVE.l  d7,_Mc2pSMC012-4
  3924.   MOVE.l  d7,_Mc2pSMC013-4
  3925.   MOVE.l  d7,_Mc2pSMC014-4
  3926.   MOVE.l  d7,_Mc2pSMC019-4
  3927.   MOVE.l  d7,_Mc2pSMC020-4
  3928.   MOVE.l  d7,_Mc2pSMC021-4
  3929.   MOVE.l  d7,_Mc2pSMC026-4
  3930.   MOVE.l  d7,_Mc2pSMC027-4
  3931.   MOVE.l  d7,_Mc2pSMC031-4
  3932.   MOVE.l  d7,_Mc2pSMC032-4
  3933.   MOVE.l  d7,_Mc2pSMC037-4
  3934.   MOVE.l  d7,_Mc2pSMC038-4
  3935.   MOVE.l  d7,_Mc2pNMSMC001-4 ;-)                  SELF MODIFYING CODE! ;-)
  3936.   MOVE.l  d7,_Mc2pNMSMC011-4
  3937.   MOVE.l  d7,_Mc2pNMSMC012-4
  3938.   MOVE.l  d7,_Mc2pNMSMC013-4
  3939.   MOVE.l  d7,_Mc2pNMSMC014-4
  3940.   MOVE.l  d7,_Mc2pNMSMC019-4
  3941.   MOVE.l  d7,_Mc2pNMSMC020-4
  3942.   MOVE.l  d7,_Mc2pNMSMC021-4
  3943.   MOVE.l  d7,_Mc2pNMSMC026-4
  3944.   MOVE.l  d7,_Mc2pNMSMC027-4
  3945.   MOVE.l  d7,_Mc2pNMSMC031-4
  3946.   MOVE.l  d7,_Mc2pNMSMC032-4
  3947.   MOVE.l  d7,_Mc2pNMSMC037-4
  3948.   MOVE.l  d7,_Mc2pNMSMC038-4
  3949.   ;SMC, #-PlaneSize
  3950.   MOVEQ.l #0,d6
  3951.   SUB.l   d7,d6 ; d6=-PlaneSize
  3952.   MOVE.l  d6,_Mc2pSMC003-4
  3953.   MOVE.l  d6,_Mc2pSMC004-4
  3954.   MOVE.l  d6,_Mc2pSMC005-4
  3955.   MOVE.l  d6,_Mc2pSMC006-4
  3956.   MOVE.l  d6,_Mc2pSMC015-4
  3957.   MOVE.l  d6,_Mc2pSMC016-4
  3958.   MOVE.l  d6,_Mc2pSMC017-4
  3959.   MOVE.l  d6,_Mc2pSMC018-4
  3960.   MOVE.l  d6,_Mc2pNMSMC003-4
  3961.   MOVE.l  d6,_Mc2pNMSMC004-4
  3962.   MOVE.l  d6,_Mc2pNMSMC005-4
  3963.   MOVE.l  d6,_Mc2pNMSMC006-4
  3964.   MOVE.l  d6,_Mc2pNMSMC015-4
  3965.   MOVE.l  d6,_Mc2pNMSMC016-4
  3966.   MOVE.l  d6,_Mc2pNMSMC017-4
  3967.   MOVE.l  d6,_Mc2pNMSMC018-4
  3968.   ;SMC, #-PlaneSize-4
  3969.   SUBQ.l  #4,d6
  3970.   MOVE.l  d6,_Mc2pSMC022-4
  3971.   MOVE.l  d6,_Mc2pSMC023-4
  3972.   MOVE.l  d6,_Mc2pSMC028-4
  3973.   MOVE.l  d6,_Mc2pSMC029-4
  3974.   MOVE.l  d6,_Mc2pSMC033-4
  3975.   MOVE.l  d6,_Mc2pSMC034-4
  3976.   MOVE.l  d6,_Mc2pSMC039-4
  3977.   MOVE.l  d6,_Mc2pSMC040-4
  3978.   MOVE.l  d6,_Mc2pNMSMC022-4
  3979.   MOVE.l  d6,_Mc2pNMSMC023-4
  3980.   MOVE.l  d6,_Mc2pNMSMC028-4
  3981.   MOVE.l  d6,_Mc2pNMSMC029-4
  3982.   MOVE.l  d6,_Mc2pNMSMC033-4
  3983.   MOVE.l  d6,_Mc2pNMSMC034-4
  3984.   MOVE.l  d6,_Mc2pNMSMC039-4
  3985.   MOVE.l  d6,_Mc2pNMSMC040-4
  3986.   ;SMC, #PlaneSize*2
  3987.   ADD.l   d7,d7
  3988.   MOVE.l  d7,_Mc2pSMC007-4
  3989.   MOVE.l  d7,_Mc2pSMC008-4
  3990.   MOVE.l  d7,_Mc2pSMC009-4
  3991.   MOVE.l  d7,_Mc2pSMC010-4
  3992.   MOVE.l  d7,_Mc2pSMC024-4
  3993.   MOVE.l  d7,_Mc2pSMC025-4
  3994.   MOVE.l  d7,_Mc2pSMC035-4
  3995.   MOVE.l  d7,_Mc2pSMC036-4
  3996.   MOVE.l  d7,_Mc2pNMSMC007-4
  3997.   MOVE.l  d7,_Mc2pNMSMC008-4
  3998.   MOVE.l  d7,_Mc2pNMSMC009-4
  3999.   MOVE.l  d7,_Mc2pNMSMC010-4
  4000.   MOVE.l  d7,_Mc2pNMSMC024-4
  4001.   MOVE.l  d7,_Mc2pNMSMC025-4
  4002.   MOVE.l  d7,_Mc2pNMSMC035-4
  4003.   MOVE.l  d7,_Mc2pNMSMC036-4
  4004.   ;SMC, #PlaneSize*4
  4005.   ADD.l   d7,d7
  4006.   MOVE.l  d7,_Mc2pSMC002-4
  4007.   MOVE.l  d7,_Mc2pSMC030-4
  4008.   MOVE.l  d7,_Mc2pNMSMC002-4
  4009.   MOVE.l  d7,_Mc2pNMSMC030-4
  4010. ;Flush the cache!
  4011.   MOVEM.l  a3-a6,-(a7) ; Just in case
  4012.   MOVE.l  $4,a6
  4013.   JSR     LVOCacheClearU(a6)
  4014.   MOVEM.l (a7)+,a3-a6 ; Restore
  4015.   RTS
  4016.  
  4017. ;*************************************************************************************
  4018.  
  4019. _Mc2pWindowWidthShort
  4020.   MOVE.w  Currentc2pWindow1,d0
  4021. _Mc2pWindowWidth
  4022. ;Return the width of an existing c2pWindow object
  4023.   !Getc2pWindowObjectPtr ; Base in a0
  4024.   MOVE.w  c2p0_Pixels-c2pWindows(a0),d0
  4025.   RTS
  4026.  
  4027. ;*************************************************************************************
  4028.  
  4029. _Mc2pWindowHeightShort
  4030.   MOVE.w  Currentc2pWindow1,d0
  4031. _Mc2pWindowHeight
  4032. ;Return the height of an existing c2pWindow object
  4033.   !Getc2pWindowObjectPtr ; Base in a0
  4034.   MOVE.w  c2p0_RowsStore-c2pWindows(a0),d0
  4035.   RTS
  4036.  
  4037. ;*************************************************************************************
  4038.  
  4039. _Mc2pWindowNewHeight
  4040. ;Having already initialised a c2pWindow object, change its height
  4041.   !Getc2pWindowObjectPtr ; Base in a0
  4042.   SUBQ.w  #1,d1 ; Loopcounter
  4043.   MOVE.w  d1,c2p0_RowsStore-c2pWindows(a0) ; Store new row counter
  4044.   RTS
  4045.  
  4046. ;*************************************************************************************
  4047.  
  4048. _Mc2pShortest
  4049.   MOVE.l  d0,d1
  4050.   MOVE.w  CurrentChunkyBitmap1,d0
  4051.   !GetBitmapObjectPtr ; Base in a0
  4052.   MOVE.l  CRsrc_Data-ChunkyResources(a0),d0 ; Chunky base address
  4053.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  4054.   BEQ     _Mc2pSkip4
  4055.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),d0 ; Add wrap bytes
  4056. _Mc2pSkip4
  4057.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip offset?
  4058.   BEQ     _Mc2pShort
  4059.   ADD.l   CRsrc_ClipBytes-ChunkyResources(a0),d0 ; Add clip bytes
  4060. _Mc2pShort
  4061.   MOVE.l  d1,d2
  4062.   MOVE.l  d0,d1
  4063.   MOVE.w  Currentc2pWindow1,d0
  4064. _Mc2p
  4065. ;AGA ChunkyToPlanar conversion.
  4066. ;Different routines for 000-030 and 040-060.
  4067.  
  4068.   ;Handle c2pWindows
  4069.   !Getc2pWindowObjectPtr ; Base into a0
  4070.   MOVE.l  a0,a2
  4071.   MOVE.w  c2p0_Pmod-c2pWindows(a2),c2p_Pmod
  4072.   BEQ     _Mc2pModuloCheck
  4073.   MOVE.w  c2p0_Cmod-c2pWindows(a2),c2p_Cmod
  4074.   BRA     _Mc2pModulo
  4075. _Mc2pModuloCheck
  4076.   MOVE.w  c2p0_Cmod-c2pWindows(a2),c2p_Cmod ; modulo>0?
  4077.   BEQ     _Mc2pNoModulo ; zero, so do a non-modulo c2p
  4078.  
  4079. _Mc2pModulo
  4080.   MOVE.w  c2p0_Pixels-c2pWindows(a2),c2p_Pixels ; Word sized
  4081.   MOVE.w  c2p0_RowsStore-c2pWindows(a2),c2p_RowsStore ; Number of rows
  4082.  
  4083.   MOVE.l  d1,a0 ; Chunky
  4084.   MOVE.l  d2,a1 ; Planar
  4085.  
  4086.   MOVE.w  c2p_RowsStore,c2p_Rows ; Also halfway through _Mc2p030
  4087.  
  4088.   MOVEM.l a3-a6,-(a7)
  4089.  
  4090.   TST.b   c2pCPUmode ; 030 routine?
  4091.   BEQ     _Mc2p030
  4092.  
  4093. ;Routine for 68040 and 68060.
  4094. ;Used to be c2p040only.
  4095. _Mc2p040
  4096.  
  4097.   MOVE.w  c2p_Pixels,a3
  4098.   ADD.l   a0,a3
  4099.  
  4100.   ADD.l   #PlaneSize,a1
  4101. _Mc2pSMC001
  4102.   MOVE.l  a1,a2
  4103.   ADD.l   #PlaneSize*4,a2
  4104. _Mc2pSMC002
  4105.  
  4106. _Mc2p040loop
  4107.   MOVE.l  (a0)+,d0
  4108.   MOVE.l  (a0)+,d1
  4109.   MOVE.l  (a0)+,d2
  4110.   MOVE.l  (a0)+,d3
  4111.   MOVE.l  (a0)+,d4
  4112.   MOVE.l  (a0)+,d5
  4113.  
  4114.   MOVE.l  d4,d7     ; Swap 16x4, part 1
  4115.   MOVE.w  d0,d4
  4116.   SWAP    d4
  4117.   MOVE.w  d4,d0
  4118.   MOVE.w  d7,d4
  4119.   MOVE.l  d5,d7
  4120.   MOVE.w  d1,d5
  4121.   SWAP    d5
  4122.   MOVE.w  d5,d1
  4123.   MOVE.w  d7,d5
  4124.  
  4125.   MOVE.l  d4,d7     ; Swap 2x4, part 1
  4126.   LSR.l   #2,d7
  4127.   EOR.l   d0,d7
  4128.   AND.l   #$33333333,d7
  4129.   EOR.l   d7,d0
  4130.   LSL.l   #2,d7
  4131.   EOR.l   d7,d4
  4132.   MOVE.l  d5,d7
  4133.   LSR.l   #2,d7
  4134.   EOR.l   d1,d7
  4135.   AND.l   #$33333333,d7
  4136.   EOR.l   d7,d1
  4137.   LSL.l   #2,d7
  4138.   EOR.l   d7,d5
  4139.  
  4140.   MOVE.l  (a0)+,a5
  4141.   MOVE.l  (a0)+,a6
  4142.  
  4143.   EXG     d4,a5
  4144.   EXG     d5,a6
  4145.  
  4146.   MOVE.l  d4,d7     ; Swap 16x4, part 2
  4147.   MOVE.w  d2,d4
  4148.   SWAP    d4
  4149.   MOVE.w  d4,d2
  4150.   MOVE.w  d7,d4
  4151.   MOVE.l  d5,d7
  4152.   MOVE.w  d3,d5
  4153.   SWAP    d5
  4154.   MOVE.w  d5,d3
  4155.   MOVE.w  d7,d5
  4156.  
  4157.   MOVE.l  d4,d7     ; Swap 2x4, part 2
  4158.   LSR.l   #2,d7
  4159.   EOR.l   d2,d7
  4160.   AND.l   #$33333333,d7
  4161.   EOR.l   d7,d2
  4162.   LSL.l   #2,d7
  4163.   EOR.l   d7,d4
  4164.   MOVE.l  d5,d7
  4165.   LSR.l   #2,d7
  4166.   EOR.l   d3,d7
  4167.   AND.l   #$33333333,d7
  4168.   EOR.l   d7,d3
  4169.   LSL.l   #2,d7
  4170.   EOR.l   d7,d5
  4171.  
  4172.   MOVE.l  d1,d7     ; Swap 4x1
  4173.   LSR.l   #4,d7
  4174.   EOR.l   d0,d7
  4175.   AND.l   #$0f0f0f0f,d7
  4176.   EOR.l   d7,d0
  4177.   LSL.l   #4,d7
  4178.   EOR.l   d7,d1
  4179.   MOVE.l  d3,d7
  4180.   LSR.l   #4,d7
  4181.   EOR.l   d2,d7
  4182.   AND.l   #$0f0f0f0f,d7
  4183.   EOR.l   d7,d2
  4184.   LSL.l   #4,d7
  4185.   EOR.l   d7,d3
  4186.  
  4187.   BRA     _Mc2pStart040a
  4188. _Mc2pX040a
  4189.  
  4190. ADD.l #-PlaneSize,a1
  4191. _Mc2pSMC003
  4192.  
  4193.   MOVE.l  (a0)+,d0
  4194.   MOVE.l  (a0)+,d1
  4195.   MOVE.l  (a0)+,d2
  4196.   MOVE.l  (a0)+,d3
  4197.   MOVE.l  (a0)+,d4
  4198.   MOVE.l  (a0)+,d5
  4199.  
  4200. ;  MOVE.l  a6,-PlaneSize(a1)
  4201. MOVE.l a6,(a1)
  4202.  
  4203.   MOVE.l  d4,d7     ; Swap 16x4, part 1
  4204.   MOVE.w  d0,d4
  4205.   SWAP    d4
  4206.   MOVE.w  d4,d0
  4207.   MOVE.w  d7,d4
  4208.   MOVE.l  d5,d7
  4209.   MOVE.w  d1,d5
  4210.   SWAP    d5
  4211.   MOVE.w  d5,d1
  4212.   MOVE.w  d7,d5
  4213.  
  4214. SUB.l #-PlaneSize,a1
  4215. _Mc2pSMC004
  4216.  
  4217.   MOVE.l  d4,d7     ; Swap 2x4, part 1
  4218.   LSR.l   #2,d7
  4219.   EOR.l   d0,d7
  4220.   AND.l   #$33333333,d7
  4221.   EOR.l   d7,d0
  4222.   LSL.l   #2,d7
  4223.   EOR.l   d7,d4
  4224.   MOVE.l  d5,d7
  4225.   LSR.l   #2,d7
  4226.   EOR.l   d1,d7
  4227.   AND.l   #$33333333,d7
  4228.   EOR.l   d7,d1
  4229.   LSL.l   #2,d7
  4230.   EOR.l   d7,d5
  4231.  
  4232. ADD.l #-PlaneSize,a2
  4233. _Mc2pSMC005
  4234.  
  4235.   MOVE.l  (a0)+,d7
  4236.   MOVE.l  (a0)+,a6
  4237.  
  4238. ;  MOVE.l  a5,-PlaneSize(a2)
  4239. MOVE.l a5,(a2)
  4240.  
  4241.   MOVE.l  d7,a5
  4242.   EXG     d4,a5
  4243.   EXG     d5,a6
  4244.  
  4245. SUB.l #-PlaneSize,a2
  4246. _Mc2pSMC006
  4247.  
  4248.   MOVE.l  d4,d7     ; Swap 16x4, part 2
  4249.   MOVE.w  d2,d4
  4250.   SWAP    d4
  4251.   MOVE.w  d4,d2
  4252.   MOVE.w  d7,d4
  4253.   MOVE.l  d5,d7
  4254.   MOVE.w  d3,d5
  4255.   SWAP    d5
  4256.   MOVE.w  d5,d3
  4257.   MOVE.w  d7,d5
  4258.  
  4259.   MOVE.l  d4,d7     ; Swap 2x4, part 2
  4260.   MOVE.l  d6,(a2)+
  4261.  
  4262.   LSR.l   #2,d7
  4263.   EOR.l   d2,d7
  4264.   AND.l   #$33333333,d7
  4265.   EOR.l   d7,d2
  4266.   LSL.l   #2,d7
  4267.   EOR.l   d7,d4
  4268.   MOVE.l  d5,d7
  4269.   LSR.l   #2,d7
  4270.   EOR.l   d3,d7
  4271.   AND.l   #$33333333,d7
  4272.   EOR.l   d7,d3
  4273.   LSL.l   #2,d7
  4274.   EOR.l   d7,d5
  4275.  
  4276.   MOVE.l  d1,d7     ; Swap 4x1
  4277.   LSR.l   #4,d7
  4278.   EOR.l   d0,d7
  4279.   MOVE.l  a4,(a1)+
  4280.  
  4281.   AND.l   #$0f0f0f0f,d7
  4282.   EOR.l   d7,d0
  4283.   LSL.l   #4,d7
  4284.   EOR.l   d7,d1
  4285.   MOVE.l  d3,d7
  4286.   LSR.l   #4,d7
  4287.   EOR.l   d2,d7
  4288.   AND.l   #$0f0f0f0f,d7
  4289.   EOR.l   d7,d2
  4290.   LSL.l   #4,d7
  4291.   EOR.l   d7,d3
  4292.  
  4293. _Mc2pStart040a
  4294.  
  4295. ADD.l #PlaneSize*2,a2
  4296. _Mc2pSMC007
  4297.  
  4298.   MOVE.l  d2,d7     ; Swap 8x2, part 1
  4299.   LSR.l   #8,d7
  4300.   EOR.l   d0,d7
  4301.   AND.l   #$00ff00ff,d7
  4302.   EOR.l   d7,d0
  4303.   LSL.l   #8,d7
  4304.   EOR.l   d7,d2
  4305.   MOVE.l  d2,d7
  4306.   LSR.l   #1,d7     ; Swap 1x2, part 1
  4307.   EOR.l   d0,d7
  4308.   AND.l   #$55555555,d7
  4309.   EOR.l   d7,d0
  4310. ;  MOVE.l  d0,PlaneSize*2(a2)
  4311. MOVE.l d0,(a2)
  4312.   ADD.l   d7,d7
  4313.   EOR.l   d7,d2
  4314.   MOVE.l  d3,d7     ; Swap 8x2, part 2
  4315.   LSR.l   #8,d7
  4316.   EOR.l   d1,d7
  4317.   AND.l   #$00ff00ff,d7
  4318.   EOR.l   d7,d1
  4319.   LSL.l   #8,d7
  4320.   EOR.l   d7,d3
  4321. SUB.l #PlaneSize*2,a2
  4322. _Mc2pSMC008
  4323.   MOVE.l  d3,d7
  4324.   LSR.l   #1,d7     ; Swap 1x2, part 2
  4325.   EOR.l   d1,d7
  4326. ADD.l #PlaneSize*2,a1
  4327. _Mc2pSMC009
  4328.   AND.l   #$55555555,d7
  4329.   EOR.l   d7,d1
  4330. ;  MOVE.l  d1,PlaneSize*2(a1)
  4331. MOVE.l d1,(a1)
  4332.   ADD.l   d7,d7
  4333.   EOR.l   d7,d3
  4334.  
  4335.   MOVE.l  d5,d7
  4336.   LSR.l   #4,d7
  4337.   EOR.l   d4,d7
  4338.   AND.l   #$0f0f0f0f,d7
  4339.   EOR.l   d7,d4
  4340.   LSL.l   #4,d7
  4341.   EOR.l   d7,d5
  4342.  
  4343. SUB.l #PlaneSize*2,a1
  4344. _Mc2pSMC010
  4345.  
  4346.   EXG     d4,a5
  4347.   EXG     d5,a6
  4348.  
  4349. ADD.l #PlaneSize,a2
  4350. _Mc2pSMC011
  4351.  
  4352.   MOVE.l  d5,d7
  4353.   LSR.l   #4,d7
  4354.   EOR.l   d4,d7
  4355.   AND.l   #$0f0f0f0f,d7
  4356.   EOR.l   d7,d4
  4357.   LSL.l   #4,d7
  4358.   EOR.l   d7,d5
  4359.  
  4360.   MOVE.l  a5,d0
  4361.   MOVE.l  a6,d1
  4362. ;  MOVE.l  d2,PlaneSize(a2)
  4363. MOVE.l d2,(a2)
  4364.  
  4365.   MOVE.l  d0,d7     ; Swap 8x2, part 3
  4366.   LSR.l   #8,d7
  4367.   EOR.l   d4,d7
  4368.   AND.l   #$00ff00ff,d7
  4369.   EOR.l   d7,d4
  4370.   LSL.l   #8,d7
  4371.   EOR.l   d7,d0
  4372. SUB.l #PlaneSize,a2
  4373. _Mc2pSMC012
  4374.   MOVE.l  d0,d7
  4375.   LSR.l   #1,d7     ; Swap 1x2, part 3
  4376.   EOR.l   d4,d7
  4377.   AND.l   #$55555555,d7
  4378.   EOR.l   d7,d4
  4379.   ADD.l   d7,d7
  4380. ADD.l #PlaneSize,a1
  4381. _Mc2pSMC013
  4382.   EOR.l   d7,d0
  4383.   MOVE.l  d1,d7     ; Swap 8x2, part 4
  4384.   LSR.l   #8,d7
  4385. ;  MOVE.l  d3,PlaneSize(a1)
  4386. MOVE.l d3,(a1)
  4387.   EOR.l   d5,d7
  4388.   AND.l   #$00ff00ff,d7
  4389.   EOR.l   d7,d5
  4390.   LSL.l   #8,d7
  4391.   EOR.l   d7,d1
  4392.   MOVE.l  d1,d7
  4393.   LSR.l   #1,d7     ; Swap 1x2, part 4
  4394.   EOR.l   d5,d7
  4395.   AND.l   #$55555555,d7
  4396.   EOR.l   d7,d5
  4397.   ADD.l   d7,d7
  4398.   EOR.l   d7,d1
  4399.  
  4400. SUB.l #PlaneSize,a1
  4401. _Mc2pSMC014
  4402.  
  4403.   MOVE.l  d0,a5
  4404.   MOVE.l  d1,a6
  4405.  
  4406.   MOVE.l  d4,d6
  4407.   MOVE.l  d5,a4
  4408.  
  4409.   CMP.l   a0,a3
  4410.   BGT     _Mc2pX040a
  4411.  
  4412. ;  MOVE.l  a6,-PlaneSize(a1)
  4413. ADD.l #-PlaneSize,a1
  4414. _Mc2pSMC015
  4415. MOVE.l a6,(a1)
  4416. ;  MOVE.l  a5,-PlaneSize(a2)
  4417. ADD.l #-PlaneSize,a2
  4418. _Mc2pSMC017
  4419. MOVE.l a5,(a2)
  4420. SUB.l #-PlaneSize,a1
  4421. _Mc2pSMC016
  4422.   MOVE.l  a4,(a1)+
  4423. SUB.l #-PlaneSize,a2
  4424. _Mc2pSMC018
  4425.   MOVE.l  d6,(a2)+
  4426.  
  4427. ;YLoop
  4428.   SUB.w   #1,c2p_Rows
  4429.   BLT     _Mc2p040skip
  4430. _Mc2p040nextrow
  4431.   ADD.w   c2p_Pixels,a3 ; end of next chunky line
  4432.   ADD.w   c2p_Pmod,a1 ; planar dest modulo
  4433.   ADD.w   c2p_Pmod,a2 ; planar dest modulo
  4434.   ADD.w   c2p_Cmod,a0 ; chunky source modulo
  4435.   ADD.w   c2p_Cmod,a3 ; end of next line plus source modulo, because a0 and a3 are compared
  4436.   BRA     _Mc2p040loop
  4437. _Mc2p040skip
  4438.  
  4439.   MOVEM.l (a7)+,a3-a6
  4440.   RTS ; Finish
  4441.  
  4442. ;Routine for 68000, 68010, 68020 and 68030.
  4443. ;Used to be c2p68030only.
  4444. _Mc2p030
  4445.  
  4446.   MOVE.l  #$33333333,d5
  4447.   MOVE.l  #$55555555,d6
  4448.   MOVE.l  #$00ff00ff,a6
  4449.  
  4450.   ADD.l   #PlaneSize,a1
  4451. _Mc2pSMC019
  4452.  
  4453.   MOVE.w  c2p_Pixels,a2
  4454.   ADD.l   a0,a2
  4455.   CMP.l   a0,a2
  4456.   BEQ     _Mc2pNone030a
  4457.  
  4458.   MOVEM.l a0-a1,-(a7)
  4459.  
  4460. _Mc2p030loop
  4461.   MOVE.l  (a0)+,d0
  4462.   MOVE.l  (a0)+,d2
  4463.   MOVE.l  (a0)+,d1
  4464.   MOVE.l  (a0)+,d3
  4465.  
  4466.   MOVE.l  #$0f0f0f0f,d4   ; Merge 4x1, part 1
  4467.   AND.l   d4,d0
  4468.   AND.l   d4,d2
  4469.   LSL.l   #4,d0
  4470.   OR.l    d2,d0
  4471.  
  4472.   AND.l   d4,d1
  4473.   AND.l   d4,d3
  4474.   LSL.l   #4,d1
  4475.   OR.l    d3,d1
  4476.  
  4477.   MOVE.l  d1,a3
  4478.  
  4479.   MOVE.l  (a0)+,d2
  4480.   MOVE.l  (a0)+,d1
  4481.   MOVE.l  (a0)+,d3
  4482.   MOVE.l  (a0)+,d7
  4483.  
  4484.   AND.l   d4,d2     ; Merge 4x1, part 2
  4485.   AND.l   d4,d1
  4486.   LSL.l   #4,d2
  4487.   OR.l    d1,d2
  4488.  
  4489.   AND.l   d4,d3
  4490.   AND.l   d4,d7
  4491.   LSL.l   #4,d3
  4492.   OR.l    d7,d3
  4493.  
  4494.   MOVE.l  a3,d1
  4495.  
  4496.   MOVE.w  d2,d7     ; Swap 16x2
  4497.   MOVE.w  d0,d2
  4498.   SWAP    d2
  4499.   MOVE.w  d2,d0
  4500.   MOVE.w  d7,d2
  4501.  
  4502.   MOVE.w  d3,d7
  4503.   MOVE.w  d1,d3
  4504.   SWAP    d3
  4505.   MOVE.w  d3,d1
  4506.   MOVE.w  d7,d3
  4507.  
  4508.   BRA     _Mc2pStart030a
  4509. _Mc2pX030a
  4510.  
  4511. ADD.l #PlaneSize,a1
  4512. _Mc2pSMC020
  4513.  
  4514.   MOVE.l  (a0)+,d0
  4515.   MOVE.l  (a0)+,d2
  4516.   MOVE.l  (a0)+,d1
  4517.   MOVE.l  (a0)+,d3
  4518.  
  4519. ;  MOVE.l  d7,PlaneSize(a1)
  4520. MOVE.l d7,(a1)
  4521.  
  4522.   MOVE.l  #$0f0f0f0f,d4   ; Merge 4x1, part 1
  4523.   AND.l   d4,d0
  4524.   AND.l   d4,d2
  4525.   LSL.l   #4,d0
  4526.   OR.l    d2,d0
  4527.  
  4528. SUB.l #PlaneSize,a1
  4529. _Mc2pSMC021
  4530.  
  4531.   AND.l   d4,d1
  4532.   AND.l   d4,d3
  4533.   LSL.l   #4,d1
  4534.   OR.l    d3,d1
  4535.  
  4536.   MOVE.l  d1,a3
  4537.  
  4538.   MOVE.l  (a0)+,d2
  4539.   MOVE.l  (a0)+,d1
  4540.   MOVE.l  (a0)+,d3
  4541.   MOVE.l  (a0)+,d7
  4542.  
  4543.   MOVE.l  a4,(a1)+
  4544.  
  4545.   AND.l   d4,d2     ; Merge 4x1, part 2
  4546.   AND.l   d4,d1
  4547.   LSL.l   #4,d2
  4548.   OR.l    d1,d2
  4549.  
  4550.   AND.l   d4,d3
  4551.   AND.l   d4,d7
  4552.   LSL.l   #4,d3
  4553.   OR.l    d7,d3
  4554.  
  4555.   MOVE.l  a3,d1
  4556.  
  4557.   MOVE.w  d2,d7     ; Swap 16x2
  4558.   MOVE.w  d0,d2
  4559.   SWAP    d2
  4560.   MOVE.w  d2,d0
  4561.   MOVE.w  d7,d2
  4562.  
  4563. ADD.l #-PlaneSize-4,a1
  4564. _Mc2pSMC022
  4565.  
  4566.   MOVE.w  d3,d7
  4567.   MOVE.w  d1,d3
  4568.   SWAP    d3
  4569.   MOVE.w  d3,d1
  4570.   MOVE.w  d7,d3
  4571.  
  4572. ;  MOVE.l  a5,-PlaneSize-4(a1)
  4573. MOVE.l a5,(a1)
  4574. SUB.l #-PlaneSize-4,a1
  4575. _Mc2pSMC023
  4576.  
  4577. _Mc2pStart030a
  4578.   MOVE.l  a6,d4
  4579.  
  4580.   MOVE.l  d2,d7     ; Swap 2x2
  4581.   LSR.l   #2,d7
  4582.   EOR.l   d0,d7
  4583.   AND.l   d5,d7
  4584.   EOR.l   d7,d0
  4585.   LSL.l   #2,d7
  4586.   EOR.l   d7,d2
  4587.  
  4588.   MOVE.l  d3,d7
  4589.   LSR.l   #2,d7
  4590.   EOR.l   d1,d7
  4591.   AND.l   d5,d7
  4592.   EOR.l   d7,d1
  4593.   LSL.l   #2,d7
  4594.   EOR.l   d7,d3
  4595.  
  4596. ADD.l #PlaneSize*2,a1
  4597. _Mc2pSMC024
  4598.  
  4599.   MOVE.l  d1,d7
  4600.   LSR.l   #8,d7
  4601.   EOR.l   d0,d7
  4602.   AND.l   d4,d7
  4603.   EOR.l   d7,d0
  4604.   LSL.l   #8,d7
  4605.   EOR.l   d7,d1
  4606.  
  4607.   MOVE.l  d1,d7
  4608.   LSR.l   #1,d7
  4609.   EOR.l   d0,d7
  4610.   AND.l   d6,d7
  4611.   EOR.l   d7,d0
  4612. ;  MOVE.l  d0,PlaneSize*2(a1)
  4613. MOVE.l d0,(a1)
  4614.   ADD.l   d7,d7
  4615.   EOR.l   d1,d7
  4616.  
  4617.   MOVE.l  d3,d1
  4618.   LSR.l   #8,d1
  4619.   EOR.l   d2,d1
  4620.   AND.l   d4,d1
  4621.   EOR.l   d1,d2
  4622.   LSL.l   #8,d1
  4623.   EOR.l   d1,d3
  4624.  
  4625. SUB.l #PlaneSize*2,a1
  4626. _Mc2pSMC025
  4627.  
  4628.   MOVE.l  d3,d1
  4629.   LSR.l   #1,d1
  4630.   EOR.l   d2,d1
  4631.   AND.l   d6,d1
  4632.   EOR.l   d1,d2
  4633.   ADD.l   d1,d1
  4634.   EOR.l   d1,d3
  4635.  
  4636.   MOVE.l  d2,a4
  4637.   MOVE.l  d3,a5
  4638.  
  4639.   CMPA.l  a0,a2
  4640.   BGT     _Mc2pX030a
  4641.  
  4642. ;  MOVE.l  d7,PlaneSize(a1)
  4643. ADD.l #PlaneSize,a1
  4644. _Mc2pSMC026
  4645. MOVE.l d7,(a1)
  4646. SUB.l #PlaneSize,a1
  4647. _Mc2pSMC027
  4648.   MOVE.l  a4,(a1)+
  4649. ;  MOVE.l  a5,-PlaneSize-4(a1)
  4650. ADD.l #-PlaneSize-4,a1
  4651. _Mc2pSMC028
  4652. MOVE.l a5,(a1)
  4653. SUB.l #-PlaneSize-4,a1
  4654. _Mc2pSMC029
  4655.  
  4656. ;YLoop
  4657.   SUB.w   #1,c2p_Rows
  4658.   BLT     _Mc2p030skip
  4659. _Mc2p030nextrow
  4660.   ADD.w   c2p_Pixels,a2 ; End of next chunky line
  4661.   ADD.w   c2p_Pmod,a1 ; Planar dest modulo
  4662.   ADD.w   c2p_Cmod,a0 ; Chunky source modulo
  4663.   ADD.w   c2p_Cmod,a2 ; End of next chunky line + Chunky source modulo
  4664.   BRA     _Mc2p030loop
  4665. _Mc2p030skip
  4666.  
  4667.   MOVEM.l (a7)+,a0-a1
  4668.  
  4669.   MOVE.w  c2p_RowsStore,c2p_Rows ; Has to be reset. Also see start of statement
  4670.   MOVE.w  c2p_Pixels,a2 ; Has to be reset!
  4671.   ADD.l   a0,a2
  4672.  
  4673.   ADD.l   #PlaneSize*4,a1
  4674. _Mc2pSMC030
  4675.  
  4676. _Mc2p030loop2
  4677.   MOVE.l  (a0)+,d0
  4678.   MOVE.l  (a0)+,d2
  4679.   MOVE.l  (a0)+,d1
  4680.   MOVE.l  (a0)+,d3
  4681.  
  4682.   MOVE.l  #$f0f0f0f0,d4   ; Merge 4x1, part 1
  4683.   AND.l   d4,d0
  4684.   AND.l   d4,d2
  4685.   LSR.l   #4,d2
  4686.   OR.l    d2,d0
  4687.  
  4688.   AND.l   d4,d1
  4689.   AND.l   d4,d3
  4690.   LSR.l   #4,d3
  4691.   OR.l    d3,d1
  4692.  
  4693.   MOVE.l  d1,a3
  4694.  
  4695.   MOVE.l  (a0)+,d2
  4696.   MOVE.l  (a0)+,d1
  4697.   MOVE.l  (a0)+,d3
  4698.   MOVE.l  (a0)+,d7
  4699.  
  4700.   AND.l   d4,d2     ; Merge 4x1, part 2
  4701.   AND.l   d4,d1
  4702.   LSR.l   #4,d1
  4703.   OR.l    d1,d2
  4704.  
  4705.   AND.l   d4,d3
  4706.   AND.l   d4,d7
  4707.   LSR.l   #4,d7
  4708.   OR.l    d7,d3
  4709.  
  4710.   MOVE.l  a3,d1
  4711.  
  4712.   MOVE.w  d2,d7     ; Swap 16x2
  4713.   MOVE.w  d0,d2
  4714.   SWAP    d2
  4715.   MOVE.w  d2,d0
  4716.   MOVE.w  d7,d2
  4717.  
  4718.   MOVE.w  d3,d7
  4719.   MOVE.w  d1,d3
  4720.   SWAP    d3
  4721.   MOVE.w  d3,d1
  4722.   MOVE.w  d7,d3
  4723.  
  4724.   BRA     _Mc2pStart030b
  4725. _Mc2pX030b
  4726.  
  4727. ADD.l #PlaneSize,a1
  4728. _Mc2pSMC031
  4729.  
  4730.   MOVE.l  (a0)+,d0
  4731.   MOVE.l  (a0)+,d2
  4732.   MOVE.l  (a0)+,d1
  4733.   MOVE.l  (a0)+,d3
  4734.  
  4735. ;  MOVE.l  d7,PlaneSize(a1)
  4736. MOVE.l d7,(a1)
  4737.  
  4738.   MOVE.l  #$f0f0f0f0,d4   ; Merge 4x1, part 1
  4739.   AND.l   d4,d0
  4740.   AND.l   d4,d2
  4741.   LSR.l   #4,d2
  4742.   OR.l    d2,d0
  4743.  
  4744. SUB.l #PlaneSize,a1
  4745. _Mc2pSMC032
  4746.  
  4747.   AND.l   d4,d1
  4748.   AND.l   d4,d3
  4749.   LSR.l   #4,d3
  4750.   OR.l    d3,d1
  4751.  
  4752.   MOVE.l  d1,a3
  4753.  
  4754.   MOVE.l  (a0)+,d2
  4755.   MOVE.l  (a0)+,d1
  4756.   MOVE.l  (a0)+,d3
  4757.   MOVE.l  (a0)+,d7
  4758.  
  4759.   MOVE.l  a4,(a1)+
  4760.  
  4761.   AND.l   d4,d2     ; Merge 4x1, part 2
  4762.   AND.l   d4,d1
  4763.   LSR.l   #4,d1
  4764.   OR.l    d1,d2
  4765.  
  4766.   AND.l   d4,d3
  4767.   AND.l   d4,d7
  4768.   LSR.l   #4,d7
  4769.   OR.l    d7,d3
  4770.  
  4771.   MOVE.l  a3,d1
  4772.  
  4773.   MOVE.w  d2,d7     ; Swap 16x2
  4774.   MOVE.w  d0,d2
  4775.   SWAP    d2
  4776.   MOVE.w  d2,d0
  4777.   MOVE.w  d7,d2
  4778.  
  4779. ADD.l #-PlaneSize-4,a1
  4780. _Mc2pSMC033
  4781.  
  4782.   MOVE.w  d3,d7
  4783.   MOVE.w  d1,d3
  4784.   SWAP    d3
  4785.   MOVE.w  d3,d1
  4786.   MOVE.w  d7,d3
  4787.  
  4788. ;  MOVE.l  a5,-PlaneSize-4(a1)
  4789. MOVE.l a5,(a1)
  4790. SUB.l #-PlaneSize-4,a1
  4791. _Mc2pSMC034
  4792.  
  4793. _Mc2pStart030b
  4794.   MOVE.l  a6,d4
  4795.  
  4796.   MOVE.l  d2,d7     ; Swap 2x2
  4797.   LSR.l   #2,d7
  4798.   EOR.l   d0,d7
  4799.   AND.l   d5,d7
  4800.   EOR.l   d7,d0
  4801.   LSL.l   #2,d7
  4802.   EOR.l   d7,d2
  4803.  
  4804.   MOVE.l  d3,d7
  4805.   LSR.l   #2,d7
  4806.   EOR.l   d1,d7
  4807.   AND.l   d5,d7
  4808.   EOR.l   d7,d1
  4809.   LSL.l   #2,d7
  4810.   EOR.l   d7,d3
  4811.  
  4812. ADD.l #PlaneSize*2,a1
  4813. _Mc2pSMC035
  4814.  
  4815.   MOVE.l  d1,d7
  4816.   LSR.l   #8,d7
  4817.   EOR.l   d0,d7
  4818.   AND.l   d4,d7
  4819.   EOR.l   d7,d0
  4820.   LSL.l   #8,d7
  4821.   EOR.l   d7,d1
  4822.  
  4823.   MOVE.l  d1,d7
  4824.   LSR.l   #1,d7
  4825.   EOR.l   d0,d7
  4826.   AND.l   d6,d7
  4827.   EOR.l   d7,d0
  4828. ;  MOVE.l  d0,PlaneSize*2(a1)
  4829. MOVE.l d0,(a1)
  4830.   ADD.l   d7,d7
  4831.   EOR.l   d1,d7
  4832.  
  4833.   MOVE.l  d3,d1
  4834.   LSR.l   #8,d1
  4835.   EOR.l   d2,d1
  4836.   AND.l   d4,d1
  4837.   EOR.l   d1,d2
  4838.   LSL.l   #8,d1
  4839.   EOR.l   d1,d3
  4840.  
  4841. SUB.l #PlaneSize*2,a1
  4842. _Mc2pSMC036
  4843.  
  4844.   MOVE.l  d3,d1
  4845.   LSR.l   #1,d1
  4846.   EOR.l   d2,d1
  4847.   AND.l   d6,d1
  4848.   EOR.l   d1,d2
  4849.   ADD.l   d1,d1
  4850.   EOR.l   d1,d3
  4851.  
  4852.   MOVE.l  d2,a4
  4853.   MOVE.l  d3,a5
  4854.  
  4855.   CMPA.l  a0,a2
  4856.   BGT     _Mc2pX030b
  4857.  
  4858. ;  MOVE.l  d7,PlaneSize(a1)
  4859. ADD.l #PlaneSize,a1
  4860. _Mc2pSMC037
  4861. MOVE.l d7,(a1)
  4862. SUB.l #PlaneSize,a1
  4863. _Mc2pSMC038
  4864.   MOVE.l  a4,(a1)+
  4865. ;  MOVE.l  a5,-PlaneSize-4(a1)
  4866. ADD.l #-PlaneSize-4,a1
  4867. _Mc2pSMC039
  4868. MOVE.l a5,(a1)
  4869. SUB.l #-PlaneSize-4,a1
  4870. _Mc2pSMC040
  4871.  
  4872. ;YLoop
  4873.   SUB.w   #1,c2p_Rows
  4874.   BLT     _Mc2p030skip2
  4875. _Mc2p030nextrow2
  4876.   ADD.w   c2p_Pixels,a2 ; End of next chunky line
  4877.   ADD.w   c2p_Pmod,a1 ; Planar dest modulo
  4878.   ADD.w   c2p_Cmod,a0 ; Chunky source modulo
  4879.   ADD.w   c2p_Cmod,a2 ; End of next chunky line + Chunky source modulo
  4880.   BRA     _Mc2p030loop2
  4881. _Mc2p030skip2
  4882.  
  4883. _Mc2pNone030a
  4884.   MOVEM.l (a7)+,a3-a6
  4885.   RTS ; Finish
  4886.  
  4887. _Mc2pNoModulo ; Non-modulo c2p
  4888.   MOVE.l  c2p0_Pixels-c2pWindows(a2),c2p_Pixels ; Longword sized
  4889.  
  4890.   MOVE.l  d1,a0 ; Chunky
  4891.   MOVE.l  d2,a1 ; Planar
  4892.  
  4893.   MOVEM.l a3-a6,-(a7)
  4894.  
  4895.   TST.b   c2pCPUmode ; 030 routine?
  4896.   BEQ     _Mc2pNM030
  4897.  
  4898. ;Routine for 68040 and 68060.
  4899. ;Used to be c2p040only.
  4900. _Mc2pNM040
  4901.  
  4902.   MOVE.l  c2p_Pixels,a3
  4903.   ADD.l   a0,a3
  4904.  
  4905.   ADD.l   #PlaneSize,a1
  4906. _Mc2pNMSMC001
  4907.   MOVE.l  a1,a2
  4908.   ADD.l   #PlaneSize*4,a2
  4909. _Mc2pNMSMC002
  4910.  
  4911. _Mc2pNM040loop
  4912.   MOVE.l  (a0)+,d0
  4913.   MOVE.l  (a0)+,d1
  4914.   MOVE.l  (a0)+,d2
  4915.   MOVE.l  (a0)+,d3
  4916.   MOVE.l  (a0)+,d4
  4917.   MOVE.l  (a0)+,d5
  4918.  
  4919.   MOVE.l  d4,d7     ; Swap 16x4, part 1
  4920.   MOVE.w  d0,d4
  4921.   SWAP    d4
  4922.   MOVE.w  d4,d0
  4923.   MOVE.w  d7,d4
  4924.   MOVE.l  d5,d7
  4925.   MOVE.w  d1,d5
  4926.   SWAP    d5
  4927.   MOVE.w  d5,d1
  4928.   MOVE.w  d7,d5
  4929.  
  4930.   MOVE.l  d4,d7     ; Swap 2x4, part 1
  4931.   LSR.l   #2,d7
  4932.   EOR.l   d0,d7
  4933.   AND.l   #$33333333,d7
  4934.   EOR.l   d7,d0
  4935.   LSL.l   #2,d7
  4936.   EOR.l   d7,d4
  4937.   MOVE.l  d5,d7
  4938.   LSR.l   #2,d7
  4939.   EOR.l   d1,d7
  4940.   AND.l   #$33333333,d7
  4941.   EOR.l   d7,d1
  4942.   LSL.l   #2,d7
  4943.   EOR.l   d7,d5
  4944.  
  4945.   MOVE.l  (a0)+,a5
  4946.   MOVE.l  (a0)+,a6
  4947.  
  4948.   EXG     d4,a5
  4949.   EXG     d5,a6
  4950.  
  4951.   MOVE.l  d4,d7     ; Swap 16x4, part 2
  4952.   MOVE.w  d2,d4
  4953.   SWAP    d4
  4954.   MOVE.w  d4,d2
  4955.   MOVE.w  d7,d4
  4956.   MOVE.l  d5,d7
  4957.   MOVE.w  d3,d5
  4958.   SWAP    d5
  4959.   MOVE.w  d5,d3
  4960.   MOVE.w  d7,d5
  4961.  
  4962.   MOVE.l  d4,d7     ; Swap 2x4, part 2
  4963.   LSR.l   #2,d7
  4964.   EOR.l   d2,d7
  4965.   AND.l   #$33333333,d7
  4966.   EOR.l   d7,d2
  4967.   LSL.l   #2,d7
  4968.   EOR.l   d7,d4
  4969.   MOVE.l  d5,d7
  4970.   LSR.l   #2,d7
  4971.   EOR.l   d3,d7
  4972.   AND.l   #$33333333,d7
  4973.   EOR.l   d7,d3
  4974.   LSL.l   #2,d7
  4975.   EOR.l   d7,d5
  4976.  
  4977.   MOVE.l  d1,d7     ; Swap 4x1
  4978.   LSR.l   #4,d7
  4979.   EOR.l   d0,d7
  4980.   AND.l   #$0f0f0f0f,d7
  4981.   EOR.l   d7,d0
  4982.   LSL.l   #4,d7
  4983.   EOR.l   d7,d1
  4984.   MOVE.l  d3,d7
  4985.   LSR.l   #4,d7
  4986.   EOR.l   d2,d7
  4987.   AND.l   #$0f0f0f0f,d7
  4988.   EOR.l   d7,d2
  4989.   LSL.l   #4,d7
  4990.   EOR.l   d7,d3
  4991.  
  4992.   BRA     _Mc2pNMStart040a
  4993. _Mc2pNMX040a
  4994.  
  4995. ADD.l #-PlaneSize,a1
  4996. _Mc2pNMSMC003
  4997.  
  4998.   MOVE.l  (a0)+,d0
  4999.   MOVE.l  (a0)+,d1
  5000.   MOVE.l  (a0)+,d2
  5001.   MOVE.l  (a0)+,d3
  5002.   MOVE.l  (a0)+,d4
  5003.   MOVE.l  (a0)+,d5
  5004.  
  5005. ;  MOVE.l  a6,-PlaneSize(a1)
  5006. MOVE.l a6,(a1)
  5007.  
  5008.   MOVE.l  d4,d7     ; Swap 16x4, part 1
  5009.   MOVE.w  d0,d4
  5010.   SWAP    d4
  5011.   MOVE.w  d4,d0
  5012.   MOVE.w  d7,d4
  5013.   MOVE.l  d5,d7
  5014.   MOVE.w  d1,d5
  5015.   SWAP    d5
  5016.   MOVE.w  d5,d1
  5017.   MOVE.w  d7,d5
  5018.  
  5019. SUB.l #-PlaneSize,a1
  5020. _Mc2pNMSMC004
  5021.  
  5022.   MOVE.l  d4,d7     ; Swap 2x4, part 1
  5023.   LSR.l   #2,d7
  5024.   EOR.l   d0,d7
  5025.   AND.l   #$33333333,d7
  5026.   EOR.l   d7,d0
  5027.   LSL.l   #2,d7
  5028.   EOR.l   d7,d4
  5029.   MOVE.l  d5,d7
  5030.   LSR.l   #2,d7
  5031.   EOR.l   d1,d7
  5032.   AND.l   #$33333333,d7
  5033.   EOR.l   d7,d1
  5034.   LSL.l   #2,d7
  5035.   EOR.l   d7,d5
  5036.  
  5037. ADD.l #-PlaneSize,a2
  5038. _Mc2pNMSMC005
  5039.  
  5040.   MOVE.l  (a0)+,d7
  5041.   MOVE.l  (a0)+,a6
  5042.  
  5043. ;  MOVE.l  a5,-PlaneSize(a2)
  5044. MOVE.l a5,(a2)
  5045.  
  5046.   MOVE.l  d7,a5
  5047.   EXG     d4,a5
  5048.   EXG     d5,a6
  5049.  
  5050. SUB.l #-PlaneSize,a2
  5051. _Mc2pNMSMC006
  5052.  
  5053.   MOVE.l  d4,d7     ; Swap 16x4, part 2
  5054.   MOVE.w  d2,d4
  5055.   SWAP    d4
  5056.   MOVE.w  d4,d2
  5057.   MOVE.w  d7,d4
  5058.   MOVE.l  d5,d7
  5059.   MOVE.w  d3,d5
  5060.   SWAP    d5
  5061.   MOVE.w  d5,d3
  5062.   MOVE.w  d7,d5
  5063.  
  5064.   MOVE.l  d4,d7     ; Swap 2x4, part 2
  5065.   MOVE.l  d6,(a2)+
  5066.  
  5067.   LSR.l   #2,d7
  5068.   EOR.l   d2,d7
  5069.   AND.l   #$33333333,d7
  5070.   EOR.l   d7,d2
  5071.   LSL.l   #2,d7
  5072.   EOR.l   d7,d4
  5073.   MOVE.l  d5,d7
  5074.   LSR.l   #2,d7
  5075.   EOR.l   d3,d7
  5076.   AND.l   #$33333333,d7
  5077.   EOR.l   d7,d3
  5078.   LSL.l   #2,d7
  5079.   EOR.l   d7,d5
  5080.  
  5081.   MOVE.l  d1,d7     ; Swap 4x1
  5082.   LSR.l   #4,d7
  5083.   EOR.l   d0,d7
  5084.   MOVE.l  a4,(a1)+
  5085.  
  5086.   AND.l   #$0f0f0f0f,d7
  5087.   EOR.l   d7,d0
  5088.   LSL.l   #4,d7
  5089.   EOR.l   d7,d1
  5090.   MOVE.l  d3,d7
  5091.   LSR.l   #4,d7
  5092.   EOR.l   d2,d7
  5093.   AND.l   #$0f0f0f0f,d7
  5094.   EOR.l   d7,d2
  5095.   LSL.l   #4,d7
  5096.   EOR.l   d7,d3
  5097.  
  5098. _Mc2pNMStart040a
  5099.  
  5100. ADD.l #PlaneSize*2,a2
  5101. _Mc2pNMSMC007
  5102.  
  5103.   MOVE.l  d2,d7     ; Swap 8x2, part 1
  5104.   LSR.l   #8,d7
  5105.   EOR.l   d0,d7
  5106.   AND.l   #$00ff00ff,d7
  5107.   EOR.l   d7,d0
  5108.   LSL.l   #8,d7
  5109.   EOR.l   d7,d2
  5110.   MOVE.l  d2,d7
  5111.   LSR.l   #1,d7     ; Swap 1x2, part 1
  5112.   EOR.l   d0,d7
  5113.   AND.l   #$55555555,d7
  5114.   EOR.l   d7,d0
  5115. ;  MOVE.l  d0,PlaneSize*2(a2)
  5116. MOVE.l d0,(a2)
  5117.   ADD.l   d7,d7
  5118.   EOR.l   d7,d2
  5119.   MOVE.l  d3,d7     ; Swap 8x2, part 2
  5120.   LSR.l   #8,d7
  5121.   EOR.l   d1,d7
  5122.   AND.l   #$00ff00ff,d7
  5123.   EOR.l   d7,d1
  5124.   LSL.l   #8,d7
  5125.   EOR.l   d7,d3
  5126. SUB.l #PlaneSize*2,a2
  5127. _Mc2pNMSMC008
  5128.   MOVE.l  d3,d7
  5129.   LSR.l   #1,d7     ; Swap 1x2, part 2
  5130.   EOR.l   d1,d7
  5131. ADD.l #PlaneSize*2,a1
  5132. _Mc2pNMSMC009
  5133.   AND.l   #$55555555,d7
  5134.   EOR.l   d7,d1
  5135. ;  MOVE.l  d1,PlaneSize*2(a1)
  5136. MOVE.l d1,(a1)
  5137.   ADD.l   d7,d7
  5138.   EOR.l   d7,d3
  5139.  
  5140.   MOVE.l  d5,d7
  5141.   LSR.l   #4,d7
  5142.   EOR.l   d4,d7
  5143.   AND.l   #$0f0f0f0f,d7
  5144.   EOR.l   d7,d4
  5145.   LSL.l   #4,d7
  5146.   EOR.l   d7,d5
  5147.  
  5148. SUB.l #PlaneSize*2,a1
  5149. _Mc2pNMSMC010
  5150.  
  5151.   EXG     d4,a5
  5152.   EXG     d5,a6
  5153.  
  5154. ADD.l #PlaneSize,a2
  5155. _Mc2pNMSMC011
  5156.  
  5157.   MOVE.l  d5,d7
  5158.   LSR.l   #4,d7
  5159.   EOR.l   d4,d7
  5160.   AND.l   #$0f0f0f0f,d7
  5161.   EOR.l   d7,d4
  5162.   LSL.l   #4,d7
  5163.   EOR.l   d7,d5
  5164.  
  5165.   MOVE.l  a5,d0
  5166.   MOVE.l  a6,d1
  5167. ;  MOVE.l  d2,PlaneSize(a2)
  5168. MOVE.l d2,(a2)
  5169.  
  5170.   MOVE.l  d0,d7     ; Swap 8x2, part 3
  5171.   LSR.l   #8,d7
  5172.   EOR.l   d4,d7
  5173.   AND.l   #$00ff00ff,d7
  5174.   EOR.l   d7,d4
  5175.   LSL.l   #8,d7
  5176.   EOR.l   d7,d0
  5177. SUB.l #PlaneSize,a2
  5178. _Mc2pNMSMC012
  5179.   MOVE.l  d0,d7
  5180.   LSR.l   #1,d7     ; Swap 1x2, part 3
  5181.   EOR.l   d4,d7
  5182.   AND.l   #$55555555,d7
  5183.   EOR.l   d7,d4
  5184.   ADD.l   d7,d7
  5185. ADD.l #PlaneSize,a1
  5186. _Mc2pNMSMC013
  5187.   EOR.l   d7,d0
  5188.   MOVE.l  d1,d7     ; Swap 8x2, part 4
  5189.   LSR.l   #8,d7
  5190. ;  MOVE.l  d3,PlaneSize(a1)
  5191. MOVE.l d3,(a1)
  5192.   EOR.l   d5,d7
  5193.   AND.l   #$00ff00ff,d7
  5194.   EOR.l   d7,d5
  5195.   LSL.l   #8,d7
  5196.   EOR.l   d7,d1
  5197.   MOVE.l  d1,d7
  5198.   LSR.l   #1,d7     ; Swap 1x2, part 4
  5199.   EOR.l   d5,d7
  5200.   AND.l   #$55555555,d7
  5201.   EOR.l   d7,d5
  5202.   ADD.l   d7,d7
  5203.   EOR.l   d7,d1
  5204.  
  5205. SUB.l #PlaneSize,a1
  5206. _Mc2pNMSMC014
  5207.  
  5208.   MOVE.l  d0,a5
  5209.   MOVE.l  d1,a6
  5210.  
  5211.   MOVE.l  d4,d6
  5212.   MOVE.l  d5,a4
  5213.  
  5214.   CMP.l   a0,a3
  5215.   BGT     _Mc2pNMX040a
  5216.  
  5217. ;  MOVE.l  a6,-PlaneSize(a1)
  5218. ADD.l #-PlaneSize,a1
  5219. _Mc2pNMSMC015
  5220. MOVE.l a6,(a1)
  5221. ;  MOVE.l  a5,-PlaneSize(a2)
  5222. ADD.l #-PlaneSize,a2
  5223. _Mc2pNMSMC017
  5224. MOVE.l a5,(a2)
  5225. SUB.l #-PlaneSize,a1
  5226. _Mc2pNMSMC016
  5227.   MOVE.l  a4,(a1)+
  5228. SUB.l #-PlaneSize,a2
  5229. _Mc2pNMSMC018
  5230.   MOVE.l  d6,(a2)+
  5231.  
  5232.   MOVEM.l (a7)+,a3-a6
  5233.   RTS ; Finish
  5234.  
  5235. ;Routine for 68000, 68010, 68020 and 68030.
  5236. ;Used to be c2p68030only.
  5237. _Mc2pNM030
  5238.  
  5239.   MOVE.l  #$33333333,d5
  5240.   MOVE.l  #$55555555,d6
  5241.   MOVE.l  #$00ff00ff,a6
  5242.  
  5243.   ADD.l   #PlaneSize,a1
  5244. _Mc2pNMSMC019
  5245.  
  5246.   MOVE.l  c2p_Pixels,a2
  5247.   ADD.l   a0,a2
  5248.   CMP.l   a0,a2
  5249.   BEQ     _Mc2pNMNone030a
  5250.  
  5251.   MOVEM.l a0-a1,-(a7)
  5252.  
  5253. _Mc2pNM030loop
  5254.   MOVE.l  (a0)+,d0
  5255.   MOVE.l  (a0)+,d2
  5256.   MOVE.l  (a0)+,d1
  5257.   MOVE.l  (a0)+,d3
  5258.  
  5259.   MOVE.l  #$0f0f0f0f,d4   ; Merge 4x1, part 1
  5260.   AND.l   d4,d0
  5261.   AND.l   d4,d2
  5262.   LSL.l   #4,d0
  5263.   OR.l    d2,d0
  5264.  
  5265.   AND.l   d4,d1
  5266.   AND.l   d4,d3
  5267.   LSL.l   #4,d1
  5268.   OR.l    d3,d1
  5269.  
  5270.   MOVE.l  d1,a3
  5271.  
  5272.   MOVE.l  (a0)+,d2
  5273.   MOVE.l  (a0)+,d1
  5274.   MOVE.l  (a0)+,d3
  5275.   MOVE.l  (a0)+,d7
  5276.  
  5277.   AND.l   d4,d2     ; Merge 4x1, part 2
  5278.   AND.l   d4,d1
  5279.   LSL.l   #4,d2
  5280.   OR.l    d1,d2
  5281.  
  5282.   AND.l   d4,d3
  5283.   AND.l   d4,d7
  5284.   LSL.l   #4,d3
  5285.   OR.l    d7,d3
  5286.  
  5287.   MOVE.l  a3,d1
  5288.  
  5289.   MOVE.w  d2,d7     ; Swap 16x2
  5290.   MOVE.w  d0,d2
  5291.   SWAP    d2
  5292.   MOVE.w  d2,d0
  5293.   MOVE.w  d7,d2
  5294.  
  5295.   MOVE.w  d3,d7
  5296.   MOVE.w  d1,d3
  5297.   SWAP    d3
  5298.   MOVE.w  d3,d1
  5299.   MOVE.w  d7,d3
  5300.  
  5301.   BRA     _Mc2pNMStart030a
  5302. _Mc2pNMX030a
  5303.  
  5304. ADD.l #PlaneSize,a1
  5305. _Mc2pNMSMC020
  5306.  
  5307.   MOVE.l  (a0)+,d0
  5308.   MOVE.l  (a0)+,d2
  5309.   MOVE.l  (a0)+,d1
  5310.   MOVE.l  (a0)+,d3
  5311.  
  5312. ;  MOVE.l  d7,PlaneSize(a1)
  5313. MOVE.l d7,(a1)
  5314.  
  5315.   MOVE.l  #$0f0f0f0f,d4   ; Merge 4x1, part 1
  5316.   AND.l   d4,d0
  5317.   AND.l   d4,d2
  5318.   LSL.l   #4,d0
  5319.   OR.l    d2,d0
  5320.  
  5321. SUB.l #PlaneSize,a1
  5322. _Mc2pNMSMC021
  5323.  
  5324.   AND.l   d4,d1
  5325.   AND.l   d4,d3
  5326.   LSL.l   #4,d1
  5327.   OR.l    d3,d1
  5328.  
  5329.   MOVE.l  d1,a3
  5330.  
  5331.   MOVE.l  (a0)+,d2
  5332.   MOVE.l  (a0)+,d1
  5333.   MOVE.l  (a0)+,d3
  5334.   MOVE.l  (a0)+,d7
  5335.  
  5336.   MOVE.l  a4,(a1)+
  5337.  
  5338.   AND.l   d4,d2     ; Merge 4x1, part 2
  5339.   AND.l   d4,d1
  5340.   LSL.l   #4,d2
  5341.   OR.l    d1,d2
  5342.  
  5343.   AND.l   d4,d3
  5344.   AND.l   d4,d7
  5345.   LSL.l   #4,d3
  5346.   OR.l    d7,d3
  5347.  
  5348.   MOVE.l  a3,d1
  5349.  
  5350.   MOVE.w  d2,d7     ; Swap 16x2
  5351.   MOVE.w  d0,d2
  5352.   SWAP    d2
  5353.   MOVE.w  d2,d0
  5354.   MOVE.w  d7,d2
  5355.  
  5356. ADD.l #-PlaneSize-4,a1
  5357. _Mc2pNMSMC022
  5358.  
  5359.   MOVE.w  d3,d7
  5360.   MOVE.w  d1,d3
  5361.   SWAP    d3
  5362.   MOVE.w  d3,d1
  5363.   MOVE.w  d7,d3
  5364.  
  5365. ;  MOVE.l  a5,-PlaneSize-4(a1)
  5366. MOVE.l a5,(a1)
  5367. SUB.l #-PlaneSize-4,a1
  5368. _Mc2pNMSMC023
  5369.  
  5370. _Mc2pNMStart030a
  5371.   MOVE.l  a6,d4
  5372.  
  5373.   MOVE.l  d2,d7     ; Swap 2x2
  5374.   LSR.l   #2,d7
  5375.   EOR.l   d0,d7
  5376.   AND.l   d5,d7
  5377.   EOR.l   d7,d0
  5378.   LSL.l   #2,d7
  5379.   EOR.l   d7,d2
  5380.  
  5381.   MOVE.l  d3,d7
  5382.   LSR.l   #2,d7
  5383.   EOR.l   d1,d7
  5384.   AND.l   d5,d7
  5385.   EOR.l   d7,d1
  5386.   LSL.l   #2,d7
  5387.   EOR.l   d7,d3
  5388.  
  5389. ADD.l #PlaneSize*2,a1
  5390. _Mc2pNMSMC024
  5391.  
  5392.   MOVE.l  d1,d7
  5393.   LSR.l   #8,d7
  5394.   EOR.l   d0,d7
  5395.   AND.l   d4,d7
  5396.   EOR.l   d7,d0
  5397.   LSL.l   #8,d7
  5398.   EOR.l   d7,d1
  5399.  
  5400.   MOVE.l  d1,d7
  5401.   LSR.l   #1,d7
  5402.   EOR.l   d0,d7
  5403.   AND.l   d6,d7
  5404.   EOR.l   d7,d0
  5405. ;  MOVE.l  d0,PlaneSize*2(a1)
  5406. MOVE.l d0,(a1)
  5407.   ADD.l   d7,d7
  5408.   EOR.l   d1,d7
  5409.  
  5410.   MOVE.l  d3,d1
  5411.   LSR.l   #8,d1
  5412.   EOR.l   d2,d1
  5413.   AND.l   d4,d1
  5414.   EOR.l   d1,d2
  5415.   LSL.l   #8,d1
  5416.   EOR.l   d1,d3
  5417.  
  5418. SUB.l #PlaneSize*2,a1
  5419. _Mc2pNMSMC025
  5420.  
  5421.   MOVE.l  d3,d1
  5422.   LSR.l   #1,d1
  5423.   EOR.l   d2,d1
  5424.   AND.l   d6,d1
  5425.   EOR.l   d1,d2
  5426.   ADD.l   d1,d1
  5427.   EOR.l   d1,d3
  5428.  
  5429.   MOVE.l  d2,a4
  5430.   MOVE.l  d3,a5
  5431.  
  5432.   CMPA.l  a0,a2
  5433.   BGT     _Mc2pNMX030a
  5434.  
  5435. ;  MOVE.l  d7,PlaneSize(a1)
  5436. ADD.l #PlaneSize,a1
  5437. _Mc2pNMSMC026
  5438. MOVE.l d7,(a1)
  5439. SUB.l #PlaneSize,a1
  5440. _Mc2pNMSMC027
  5441.   MOVE.l  a4,(a1)+
  5442. ;  MOVE.l  a5,-PlaneSize-4(a1)
  5443. ADD.l #-PlaneSize-4,a1
  5444. _Mc2pNMSMC028
  5445. MOVE.l a5,(a1)
  5446. SUB.l #-PlaneSize-4,a1
  5447. _Mc2pNMSMC029
  5448.  
  5449.   MOVEM.l (a7)+,a0-a1
  5450.  
  5451.   MOVE.l  c2p_Pixels,a2 ; Has to be reset!
  5452.   ADD.l   a0,a2
  5453.  
  5454.   ADD.l   #PlaneSize*4,a1
  5455. _Mc2pNMSMC030
  5456.  
  5457. _Mc2pNM030loop2
  5458.   MOVE.l  (a0)+,d0
  5459.   MOVE.l  (a0)+,d2
  5460.   MOVE.l  (a0)+,d1
  5461.   MOVE.l  (a0)+,d3
  5462.  
  5463.   MOVE.l  #$f0f0f0f0,d4   ; Merge 4x1, part 1
  5464.   AND.l   d4,d0
  5465.   AND.l   d4,d2
  5466.   LSR.l   #4,d2
  5467.   OR.l    d2,d0
  5468.  
  5469.   AND.l   d4,d1
  5470.   AND.l   d4,d3
  5471.   LSR.l   #4,d3
  5472.   OR.l    d3,d1
  5473.  
  5474.   MOVE.l  d1,a3
  5475.  
  5476.   MOVE.l  (a0)+,d2
  5477.   MOVE.l  (a0)+,d1
  5478.   MOVE.l  (a0)+,d3
  5479.   MOVE.l  (a0)+,d7
  5480.  
  5481.   AND.l   d4,d2     ; Merge 4x1, part 2
  5482.   AND.l   d4,d1
  5483.   LSR.l   #4,d1
  5484.   OR.l    d1,d2
  5485.  
  5486.   AND.l   d4,d3
  5487.   AND.l   d4,d7
  5488.   LSR.l   #4,d7
  5489.   OR.l    d7,d3
  5490.  
  5491.   MOVE.l  a3,d1
  5492.  
  5493.   MOVE.w  d2,d7     ; Swap 16x2
  5494.   MOVE.w  d0,d2
  5495.   SWAP    d2
  5496.   MOVE.w  d2,d0
  5497.   MOVE.w  d7,d2
  5498.  
  5499.   MOVE.w  d3,d7
  5500.   MOVE.w  d1,d3
  5501.   SWAP    d3
  5502.   MOVE.w  d3,d1
  5503.   MOVE.w  d7,d3
  5504.  
  5505.   BRA     _Mc2pNMStart030b
  5506. _Mc2pNMX030b
  5507.  
  5508. ADD.l #PlaneSize,a1
  5509. _Mc2pNMSMC031
  5510.  
  5511.   MOVE.l  (a0)+,d0
  5512.   MOVE.l  (a0)+,d2
  5513.   MOVE.l  (a0)+,d1
  5514.   MOVE.l  (a0)+,d3
  5515.  
  5516. ;  MOVE.l  d7,PlaneSize(a1)
  5517. MOVE.l d7,(a1)
  5518.  
  5519.   MOVE.l  #$f0f0f0f0,d4   ; Merge 4x1, part 1
  5520.   AND.l   d4,d0
  5521.   AND.l   d4,d2
  5522.   LSR.l   #4,d2
  5523.   OR.l    d2,d0
  5524.  
  5525. SUB.l #PlaneSize,a1
  5526. _Mc2pNMSMC032
  5527.  
  5528.   AND.l   d4,d1
  5529.   AND.l   d4,d3
  5530.   LSR.l   #4,d3
  5531.   OR.l    d3,d1
  5532.  
  5533.   MOVE.l  d1,a3
  5534.  
  5535.   MOVE.l  (a0)+,d2
  5536.   MOVE.l  (a0)+,d1
  5537.   MOVE.l  (a0)+,d3
  5538.   MOVE.l  (a0)+,d7
  5539.  
  5540.   MOVE.l  a4,(a1)+
  5541.  
  5542.   AND.l   d4,d2     ; Merge 4x1, part 2
  5543.   AND.l   d4,d1
  5544.   LSR.l   #4,d1
  5545.   OR.l    d1,d2
  5546.  
  5547.   AND.l   d4,d3
  5548.   AND.l   d4,d7
  5549.   LSR.l   #4,d7
  5550.   OR.l    d7,d3
  5551.  
  5552.   MOVE.l  a3,d1
  5553.  
  5554.   MOVE.w  d2,d7     ; Swap 16x2
  5555.   MOVE.w  d0,d2
  5556.   SWAP    d2
  5557.   MOVE.w  d2,d0
  5558.   MOVE.w  d7,d2
  5559.  
  5560. ADD.l #-PlaneSize-4,a1
  5561. _Mc2pNMSMC033
  5562.  
  5563.   MOVE.w  d3,d7
  5564.   MOVE.w  d1,d3
  5565.   SWAP    d3
  5566.   MOVE.w  d3,d1
  5567.   MOVE.w  d7,d3
  5568.  
  5569. ;  MOVE.l  a5,-PlaneSize-4(a1)
  5570. MOVE.l a5,(a1)
  5571. SUB.l #-PlaneSize-4,a1
  5572. _Mc2pNMSMC034
  5573.  
  5574. _Mc2pNMStart030b
  5575.   MOVE.l  a6,d4
  5576.  
  5577.   MOVE.l  d2,d7     ; Swap 2x2
  5578.   LSR.l   #2,d7
  5579.   EOR.l   d0,d7
  5580.   AND.l   d5,d7
  5581.   EOR.l   d7,d0
  5582.   LSL.l   #2,d7
  5583.   EOR.l   d7,d2
  5584.  
  5585.   MOVE.l  d3,d7
  5586.   LSR.l   #2,d7
  5587.   EOR.l   d1,d7
  5588.   AND.l   d5,d7
  5589.   EOR.l   d7,d1
  5590.   LSL.l   #2,d7
  5591.   EOR.l   d7,d3
  5592.  
  5593. ADD.l #PlaneSize*2,a1
  5594. _Mc2pNMSMC035
  5595.  
  5596.   MOVE.l  d1,d7
  5597.   LSR.l   #8,d7
  5598.   EOR.l   d0,d7
  5599.   AND.l   d4,d7
  5600.   EOR.l   d7,d0
  5601.   LSL.l   #8,d7
  5602.   EOR.l   d7,d1
  5603.  
  5604.   MOVE.l  d1,d7
  5605.   LSR.l   #1,d7
  5606.   EOR.l   d0,d7
  5607.   AND.l   d6,d7
  5608.   EOR.l   d7,d0
  5609. ;  MOVE.l  d0,PlaneSize*2(a1)
  5610. MOVE.l d0,(a1)
  5611.   ADD.l   d7,d7
  5612.   EOR.l   d1,d7
  5613.  
  5614.   MOVE.l  d3,d1
  5615.   LSR.l   #8,d1
  5616.   EOR.l   d2,d1
  5617.   AND.l   d4,d1
  5618.   EOR.l   d1,d2
  5619.   LSL.l   #8,d1
  5620.   EOR.l   d1,d3
  5621.  
  5622. SUB.l #PlaneSize*2,a1
  5623. _Mc2pNMSMC036
  5624.  
  5625.   MOVE.l  d3,d1
  5626.   LSR.l   #1,d1
  5627.   EOR.l   d2,d1
  5628.   AND.l   d6,d1
  5629.   EOR.l   d1,d2
  5630.   ADD.l   d1,d1
  5631.   EOR.l   d1,d3
  5632.  
  5633.   MOVE.l  d2,a4
  5634.   MOVE.l  d3,a5
  5635.  
  5636.   CMPA.l  a0,a2
  5637.   BGT     _Mc2pNMX030b
  5638.  
  5639. ;  MOVE.l  d7,PlaneSize(a1)
  5640. ADD.l #PlaneSize,a1
  5641. _Mc2pNMSMC037
  5642. MOVE.l d7,(a1)
  5643. SUB.l #PlaneSize,a1
  5644. _Mc2pNMSMC038
  5645.   MOVE.l  a4,(a1)+
  5646. ;  MOVE.l  a5,-PlaneSize-4(a1)
  5647. ADD.l #-PlaneSize-4,a1
  5648. _Mc2pNMSMC039
  5649. MOVE.l a5,(a1)
  5650. SUB.l #-PlaneSize-4,a1
  5651. _Mc2pNMSMC040
  5652.  
  5653. _Mc2pNMNone030a
  5654.   MOVEM.l (a7)+,a3-a6
  5655.   RTS ; Finish
  5656.  
  5657. ;*************************************************************************************
  5658.  
  5659. _MReservec2pWindows
  5660. ;Reserve memory for c2pWindow structures
  5661.   MOVE.l  d0,d7
  5662.   TST.l   c2pWindowsMem ; Check for existing mem allocated
  5663.   BEQ     _MReservec2pWindowsskip ; If exists, deallocate
  5664.   MOVE.w  c2pWindowsTotal,d0
  5665.   EXT.l   d0
  5666.   LSL.l   #c2pWindowStructSize,d0
  5667.   MOVE.l  c2pWindowsMem,a1
  5668.   ALibJsr #BlitzFreemem ; Free memory
  5669.   MOVE.l  d7,d0
  5670.   MOVE.w  #0,c2pWindowsTotal
  5671.   MOVE.l  #0,c2pWindowsMem
  5672. _MReservec2pWindowsskip
  5673.   AND.l   #$FFFF,d0
  5674.   MOVE.w  d0,d7
  5675.   LSL.l   #c2pWindowStructSize,d0
  5676.   MOVE.l  #ClearPublicMem,d1 ; MemType (public and clear)
  5677.   !CheckAvailMem{003}
  5678.   TST.b   d2 ; Likely?
  5679.   BEQ     _MReservec2pWindowsfailed
  5680.   ALibJsr #BlitzAllocmem ; Allocate memory
  5681.   TST.l   d0
  5682.   BEQ     _MReservec2pWindowsfailed
  5683.   MOVE.l  d0,c2pWindowsMem
  5684.   MOVE.w  d7,c2pWindowsTotal
  5685.   RTS     ; Return memory address in d0.l
  5686. _MReservec2pWindowsfailed
  5687.   MOVEQ.l #0,d0 ; Errorcode
  5688.   RTS
  5689.  
  5690. ;*************************************************************************************
  5691.  
  5692. _MReserveChunkyShapesShort
  5693.   MOVE.w  CurrentChunkyShapeBank,d1
  5694. _MReserveShapes
  5695. _MReserveChunkyShapes
  5696. ;Reserve memory for ChunkyShape structures
  5697.   MOVE.w  d1,-(a7) ; Store bank number
  5698.   TST.l   ChunkyShapesMem ; Needs freeing?
  5699.   BEQ     ReserveCSSkip
  5700.   MOVE.w  d0,d6 ; Store
  5701.   BSR     _MFreeChunkyShapes
  5702.   MOVE.w  d6,d0 ; Restore
  5703. ReserveCSSkip
  5704.   MOVE.w  d0,d7
  5705.   MOVE.l  ChunkyShapesMem,d6
  5706.   MOVE.w  ChunkyShapesTotal,d5
  5707.   EXT.l   d5
  5708.   !ReserveChunkyResourceStructs{001}
  5709.   MOVE.w  d7,ChunkyShapesTotal
  5710.   MOVE.l  d0,ChunkyShapesMem
  5711.   LEA     ChunkyShapeBanks,a0
  5712.   MOVE.w  (a7)+,d1 ; Restore bank number
  5713.   EXT.l   d1
  5714.   MOVE.l  d1,d4 ; Store
  5715.   LSL.l   #3,d1 ; *8 for offset
  5716.   ADD.l   d1,a0
  5717.   MOVE.l  d0,(a0)+ ; Store ChunkyShapesMem
  5718.   MOVE.w  d7,(a0) ; Store ChunkyShapesTotal
  5719.   MOVE.l  d4,d0 ; Prepare
  5720.   BRA     _MUseShapeBank ; Use this bank
  5721.   RTS     ; Precaution. Return memory address in d0.l
  5722.  
  5723. ;*************************************************************************************
  5724. _MReserveBitmaps
  5725. _MReserveChunkyBitmaps
  5726. ;Reserve memory for ChunkyBitmap structures
  5727.   TST.l   ChunkyBitmapsMem ; Needs freeing?
  5728.   BEQ     ReserveCBSkip
  5729.   MOVE.w  d0,d6 ; Store
  5730.   BSR     _MFreeChunkyBitmaps
  5731.   MOVE.w  d6,d0 ; Restore
  5732. ReserveCBSkip
  5733.   MOVE.w  d0,d7
  5734.   MOVE.l  ChunkyBitmapsMem,d6
  5735.   MOVE.w  ChunkyBitmapsTotal,d5
  5736.   EXT.l   d5
  5737.   !ReserveChunkyResourceStructs{002}
  5738.   MOVE.w  d7,ChunkyBitmapsTotal
  5739.   MOVE.l  d0,ChunkyBitmapsMem
  5740.   RTS     ; Return memory address in d0.l
  5741.  
  5742. ;*************************************************************************************
  5743. _MShape
  5744. _MChunkyShape
  5745. ;Initialise a new ChunkyShape object
  5746.   !RoundUpWidth{001} ; Make width multiple of 4
  5747.   !GetShapeObjectPtr ; Get base of struct
  5748.   MOVE.l  a0,a2 ; Store base pointer
  5749.   !DeallocResourceObject{002} ; Deallocate existing data
  5750.   !InitData ; Shared setup
  5751.   !NewChunkyMem{001} ; Returns address in d0
  5752.   MOVE.l  a2,a0
  5753.   TST.b   d2
  5754.   BEQ     InitCSFailed
  5755.   MOVE.l  a2,a0 ; Get base in a0
  5756.   !StoreResourceDataMemInfo
  5757.   TST.b   CShape_AutoCookie ; Automatically make a cookie?
  5758.   BEQ     InitCSNoCookie
  5759.   MOVE.l  d4,d0 ; Get total bytes
  5760.   !NewChunkyMem{002} ; Returns address in d0
  5761.   MOVE.l  a2,a0
  5762.   TST.b   d2
  5763.   BEQ     InitCSFailed2
  5764.   !StoreResourceStencilMemInfo
  5765.   BRA     InitCSSkip
  5766. InitCSNoCookie
  5767.   !WriteDefaultStencilInfo{002}
  5768. InitCSSkip
  5769.   !FinishResourceInit
  5770.   TST.b   AutoChunkyShapesUse ; Use it?
  5771.   BEQ     InitCSDontUse ; No
  5772.   MOVE.w  d5,CurrentChunkyShape1 ; Yes, store shape number in current
  5773. InitCSDontUse
  5774.   MOVE.l  a2,a0 ; Base in a0
  5775.   MOVE.b  CShape_AutoClip,CRsrc_Clipping-ChunkyResources(a0)
  5776.   MOVE.b  CShape_AutoWrap,CRsrc_Wrapping-ChunkyResources(a0)
  5777.   !WriteDefaultClipData
  5778.   MOVE.l  CRsrc_Data-ChunkyResources(a0),d0 ; Success return value as data address (aligned)
  5779.   RTS     ; Successful, return
  5780.  
  5781. InitCSFailed
  5782.   MOVEQ.l #0,d0
  5783.   RTS     ; Return errorcode in d0
  5784. InitCSFailed2
  5785.   MOVE.l  a2,a0 ; Get base in a0
  5786.   MOVE.l  #-1,(a0) ; Dummy value so that it will deallocate data mem
  5787.   MOVE.b  #0,CRsrc_SHere-ChunkyResources(a0) ; In case stencil data previously exists, prevent attempted deallocation
  5788.   !DeallocResourceObject{003} ; Deallocate existing data
  5789.   MOVEQ.l #0,d0
  5790.   RTS     ; Return errorcode in d0
  5791.  
  5792. ;*************************************************************************************
  5793. _MBitmap
  5794. _MChunkyBitmap
  5795. ;Initialise a new ChunkyBitmap object
  5796.   !RoundUpWidth{002} ; Make width multiple of 4
  5797.   !GetBitmapObjectPtr ; Get base of struct
  5798.   MOVE.l  a0,a2 ; Store base pointer
  5799.   !DeallocResourceObject{004} ; Deallocate existing data
  5800.   !InitData ; Shared setup
  5801.   !NewChunkyMem{003} ; Returns address in d0
  5802.   MOVE.l  a2,a0
  5803.   TST.b   d2
  5804.   BEQ     InitCBFailed
  5805.   MOVE.l  a2,a0 ; Get base in a0
  5806.   !StoreResourceDataMemInfo
  5807.   TST.b   CBitmap_AutoStencil ; Automatically make a stencil?
  5808.   BEQ     InitCBNoStencil
  5809.   MOVE.l  d4,d0 ; Get total bytes
  5810.   !NewChunkyMem{004} ; Returns address in d0
  5811.   MOVE.l  a2,a0
  5812.   TST.b   d2
  5813.   BEQ     InitCBFailed2
  5814.   !StoreResourceStencilMemInfo
  5815.   BRA     InitCBSkip
  5816. InitCBNoStencil
  5817.   !WriteDefaultStencilInfo{003}
  5818. InitCBSkip
  5819.   !FinishResourceInit
  5820.   TST.b   AutoChunkyBitmapsUse ; Use it?
  5821.   BEQ     InitCBDontUse ; No
  5822.   MOVE.w  d5,CurrentChunkyBitmap1 ; Yes, store bitmap number in current
  5823. InitCBDontUse
  5824.   MOVE.l  a2,a0 ; Base in a0
  5825.   MOVE.b  CBitmap_AutoClip,CRsrc_Clipping-ChunkyResources(a0)
  5826.   MOVE.b  CBitmap_AutoWrap,CRsrc_Wrapping-ChunkyResources(a0)
  5827.   !WriteDefaultClipData
  5828.   MOVE.l  CRsrc_Data-ChunkyResources(a0),d0 ; Success return value as data address (aligned)
  5829.   RTS     ; Successful, return
  5830.  
  5831. InitCBFailed
  5832.   MOVEQ.l #0,d0
  5833.   RTS     ; Return errorcode in d0
  5834. InitCBFailed2
  5835.   MOVE.l  a2,a0 ; Get base in a0
  5836.   MOVE.l  #-1,CRsrc_Width-ChunkyResources(a0) ; Dummy value so that it will deallocate data mem
  5837.   MOVE.b  #0,CRsrc_SHere-ChunkyResources(a0) ; In case stencil data previously exists, prevent attempted deallocation
  5838.   !DeallocResourceObject{005} ; Deallocate existing data
  5839.   MOVEQ.l #0,d0
  5840.   RTS     ; Return errorcode in d0
  5841.  
  5842. ;*************************************************************************************
  5843. _MAutoCookie
  5844. _MAutoChunkyShapeCookie
  5845. ;Switch on/off ChunkyShape Auto-Cookie creation feature
  5846.   MOVE.b  d0,CShape_AutoCookie
  5847.   RTS
  5848.  
  5849. ;*************************************************************************************
  5850. _MAutoStencil
  5851. _MAutoChunkyBitmapStencil
  5852. ;Switch on/off ChunkyBitmap Auto-Stencil creation feature
  5853.   MOVE.b  d0,CBitmap_AutoStencil
  5854.   RTS
  5855.  
  5856. ;*************************************************************************************
  5857.  
  5858. _MFreec2pWindowsRange
  5859. ;Free a range of c2pWindow objects
  5860.   SUB.w   d0,d1 ; Total
  5861.   MOVE.w  d1,d3 ; Loopcounter, no need for -1
  5862.   MOVE.w  d0,d4 ; Start offset
  5863. _MFreec2pWindowsRangeloop
  5864.   MOVE.w  d3,d0
  5865.   ADD.w   d4,d0
  5866.   BSR     _MFreec2pWindow
  5867.   DBRA    d3,_MFreec2pWindowsRangeloop
  5868.   RTS
  5869. _MFreec2pWindows
  5870. ;Free all c2pWindow objects
  5871.   MOVE.w  c2pWindowsTotal,d3
  5872.   SUBQ.w  #1,d3 ; loopcounter
  5873. _MFreec2pWindowsloop
  5874.   MOVE.w  d3,d0
  5875.   BSR     _MFreec2pWindow ; Free it
  5876.   DBRA    d3,_MFreec2pWindowsloop
  5877.   RTS
  5878. _MFreec2pWindow
  5879. ;Free a single c2pWindow object. No actual memory to free so just make inactive
  5880.   !Getc2pWindowObjectPtr ; Base into a0
  5881.   TST.l   c2p0_Pixels-c2pWindows(a0) ; Test Pixels and RowsStore
  5882.   BEQ     _MFreec2pWindowSkip
  5883.   MOVE.l  #0,c2p0_Pixels-c2pWindows(a0) ; Make it dead
  5884. _MFreec2pWindowSkip
  5885.   RTS
  5886.  
  5887. ;*************************************************************************************
  5888.  
  5889. _MFreeChunkyShapesRange
  5890. ;Free a range of ChunkyShape objects
  5891.   SUB.w   d0,d1 ; Total
  5892.   MOVE.w  d1,d7 ; Loopcounter, no need for -1
  5893.   MOVE.w  d0,d4 ; Start offset
  5894. FreeCSRloop
  5895.   MOVE.w  d7,d0
  5896.   ADD.w   d4,d0
  5897.   BSR     _MFreeChunkyShape ; Free it
  5898.   DBRA    d7,FreeCSRloop
  5899.   RTS
  5900. _MFreeShapes
  5901. _MFreeChunkyShapes
  5902. ;Free all ChunkyShape objects
  5903.   MOVE.w  ChunkyShapesTotal,d7
  5904.   SUBQ.w  #1,d7 ; loopcounter
  5905. FreeCSloop
  5906.   MOVE.w  d7,d0
  5907.   BSR     _MFreeChunkyShape ; Free it
  5908.   DBRA    d7,FreeCSloop
  5909. FreeCSsSkip
  5910.   RTS
  5911. _MFreeShape
  5912. _MFreeChunkyShape
  5913. ;Free a single ChunkyShape objects
  5914.   !GetShapeObjectPtr ; Get base of struct in a0
  5915.   !DeallocResourceObject{006} ; Deallocate existing data & make the object dead
  5916.   RTS
  5917.  
  5918. ;*************************************************************************************
  5919.  
  5920. _MFreeChunkyBitmapsRange
  5921. ;Free a range of ChunkyBitmap objects
  5922.   SUB.w   d0,d1 ; Total
  5923.   MOVE.w  d1,d7 ; Loopcounter, no need for -1
  5924.   MOVE.w  d0,d4 ; Start offset
  5925. FreeCBRloop
  5926.   MOVE.w  d7,d0
  5927.   ADD.w   d4,d0
  5928.   BSR     _MFreeChunkyBitmap ; Free it
  5929.   DBRA    d7,FreeCBRloop
  5930.   RTS
  5931. _MFreeBitmaps
  5932. _MFreeChunkyBitmaps
  5933. ;Free all ChunkyBitmap objects
  5934.   MOVE.w  ChunkyBitmapsTotal,d7
  5935.   SUBQ.w  #1,d7 ; loopcounter
  5936. FreeCBloop
  5937.   MOVE.w  d7,d0
  5938.   BSR     _MFreeChunkyBitmap ; Free it
  5939.   DBRA    d7,FreeCBloop
  5940.   RTS
  5941. _MFreeBitmap
  5942. _MFreeChunkyBitmap
  5943. ;Free a single ChunkyBitmap object
  5944.   !GetBitmapObjectPtr ; Get base of struct in a0
  5945.   !DeallocResourceObject{007} ; Deallocate existing data and make the object dead
  5946.   RTS
  5947.  
  5948. ;*************************************************************************************
  5949. _MChunkyShapeWidthShort
  5950.   MOVE.w  CurrentChunkyShape1,d0
  5951. _MShapeWidth
  5952. _MChunkyShapeWidth
  5953. ;Returns the width of the specified ChunkyShape
  5954.   !GetShapeObjectPtr ; In a0
  5955.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d0
  5956.   RTS
  5957.  
  5958. ;*************************************************************************************
  5959. _MChunkyBitmapWidthShort
  5960.   MOVE.w  CurrentChunkyBitmap1,d0
  5961. _MBitmapWidth
  5962. _MChunkyBitmapWidth
  5963. ;Returns the width of the specified ChunkyBitmap
  5964.   !GetBitmapObjectPtr ; In a0
  5965.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d0
  5966.   RTS
  5967.  
  5968. ;*************************************************************************************
  5969. _MChunkyShapeHeightShort
  5970.   MOVE.w  CurrentChunkyShape1,d0
  5971. _MShapeHeight
  5972. _MChunkyShapeHeight
  5973. ;Returns the height of the specified ChunkyShape
  5974.   !GetShapeObjectPtr ; In a0
  5975.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d0
  5976.   RTS
  5977.  
  5978. ;*************************************************************************************
  5979. _MChunkyBitmapHeightShort
  5980.   MOVE.w  CurrentChunkyBitmap1,d0
  5981. _MBitmapHeight
  5982. _MChunkyBitmapHeight
  5983. ;Returns the height of the specified ChunkyBitmap
  5984.   !GetBitmapObjectPtr ; In a0
  5985.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d0
  5986.   RTS
  5987.  
  5988. ;*************************************************************************************
  5989.  
  5990. _MAddrc2pWindowShort
  5991.   MOVE.w  Currentc2pWindow1,d0
  5992. _MAddrc2pWindow
  5993. ;Returns the address of the specified c2pWindow structure
  5994.   !Getc2pWindowObjectPtr ; In a0
  5995.   MOVE.l  a0,d0 ; Return address
  5996.   RTS
  5997.  
  5998. ;*************************************************************************************
  5999. _MAddrChunkyShapeShort
  6000.   MOVE.w  CurrentChunkyShape1,d0
  6001. _MAddrShape
  6002. _MAddrChunkyShape
  6003. ;Returns the address of the specified ChunkyShape structure
  6004.   !GetShapeObjectPtr ; In a0
  6005.   MOVE.l  a0,d0 ; Return address
  6006.   RTS
  6007.  
  6008. ;*************************************************************************************
  6009. _MAddrChunkyBitmapShort
  6010.   MOVE.w  CurrentChunkyBitmap1,d0
  6011. _MAddrBitmap
  6012. _MAddrChunkyBitmap
  6013. ;Returns the address of the specified ChunkyBitmap structure
  6014.   !GetBitmapObjectPtr ; In a0
  6015.   MOVE.l  a0,d0 ; Return address
  6016.   RTS
  6017.  
  6018. ;*************************************************************************************
  6019. _MHandle
  6020. _MChunkyShapeHandle
  6021. ;Set a new handle/origin for a ChunkyShape
  6022.   !GetShapeObjectPtr ; Base in a0
  6023.   MOVE.w  d1,CRsrc_XHandle-ChunkyResources(a0) ; Store X Handle/origin
  6024.   MOVE.w  d2,CRsrc_YHandle-ChunkyResources(a0) ; Store Y Handle/origin
  6025.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d7
  6026.   MULU    d2,d7
  6027.   EXT.l   d1
  6028.   ADD.l   d1,d7 ; Wrap bytes
  6029.   MOVE.l  d7,CRsrc_WrapBytes-ChunkyResources(a0) ; Store WrapBytes
  6030.   RTS
  6031.  
  6032. ;*************************************************************************************
  6033. _MBitmapOrigin
  6034. _MChunkyBitmapOrigin
  6035. ;Set a new handle/origin for a ChunkyBitmap
  6036.   !GetBitmapObjectPtr ; Base in a0
  6037.   MOVE.w  d1,CRsrc_XHandle-ChunkyResources(a0) ; Store X Handle/origin
  6038.   MOVE.w  d2,CRsrc_YHandle-ChunkyResources(a0) ; Store Y Handle/origin
  6039.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d7
  6040.   MULU    d2,d7
  6041.   EXT.l   d1
  6042.   ADD.l   d1,d7 ; Wrap bytes
  6043.   MOVE.l  d7,CRsrc_WrapBytes-ChunkyResources(a0) ; Store WrapBytes
  6044.   RTS
  6045.  
  6046. ;*************************************************************************************
  6047.  
  6048. _MUsec2pWindow
  6049. ;Set the currently used c2pWindows
  6050.   MOVE.w  d2,Currentc2pWindow3
  6051. _MUsec2pWindowShort
  6052.   MOVE.w  d1,Currentc2pWindow2
  6053. _MUsec2pWindowShortest
  6054.   MOVE.w  d0,Currentc2pWindow1
  6055.   RTS
  6056.  
  6057. ;*************************************************************************************
  6058. _MUseShape
  6059. _MUseChunkyShape
  6060. ;Set the currently used ChunkyShapes
  6061.   MOVE.w  d2,CurrentChunkyShape3
  6062. _MUseChunkyShapeShort
  6063.   MOVE.w  d1,CurrentChunkyShape2
  6064. _MUseChunkyShapeShortest
  6065.   MOVE.w  d0,CurrentChunkyShape1
  6066.   RTS
  6067.  
  6068. ;*************************************************************************************
  6069. _MUseBitmap
  6070. _MUseChunkyBitmap
  6071. ;Set the currently used ChunkyBitmaps
  6072.   MOVE.w  d2,CurrentChunkyBitmap3
  6073. _MUseChunkyBitmapShort
  6074.   MOVE.w  d1,CurrentChunkyBitmap2
  6075. _MUseChunkyBitmapShortest
  6076.   MOVE.w  d0,CurrentChunkyBitmap1
  6077.   RTS
  6078.  
  6079. ;*************************************************************************************
  6080.  
  6081. _MUsedc2pWindow
  6082. ;Returns number of main currently used c2pWindow, or likely -1 if not defined
  6083.   MOVE.w  Currentc2pWindow1,d0
  6084.   RTS
  6085.  
  6086. ;*************************************************************************************
  6087. _MUsedShape
  6088. _MUsedChunkyShape
  6089. ;Returns number of main currently used ChunkyShape, or likely -1 if not defined
  6090.   MOVE.w  CurrentChunkyShape1,d0
  6091.   RTS
  6092.  
  6093. ;*************************************************************************************
  6094. _MUsedBitmap
  6095. _MUsedChunkyBitmap
  6096. ;Returns number of main currently used ChunkyBitmap, or likely -1 if not defined
  6097.   MOVE.w  CurrentChunkyBitmap1,d0
  6098.   RTS
  6099.  
  6100. ;*************************************************************************************
  6101. _MCludgeShape
  6102. _MCludgeChunkyShape
  6103. ;Cludge a new ChunkyShape object from existing memory
  6104.   SUB.l   #16,d3 ; Prepare for alignment
  6105.   !RoundUpWidth{003} ; Make width multilpe of 4
  6106.   !GetShapeObjectPtr ; Get base of struct
  6107.   MOVE.l  a0,a2 ; Store base pointer
  6108.   !DeallocResourceObject{008} ; Deallocate existing data
  6109.   !InitData ; Shared setup
  6110.   MOVE.l  d3,d0 ; Put address in d0
  6111.   MOVE.l  a2,a0 ; Get base in a0
  6112.   !StoreResourceDataMemInfo2
  6113.   TST.b   CShape_AutoCookie ; Automatically make a cookie?
  6114.   BEQ     CludgeCSNoCookie
  6115.   MOVE.l  d4,d0 ; Get total bytes
  6116.   !NewChunkyMem{005} ; Returns address in d0
  6117.   MOVE.l  a2,a0
  6118.   TST.b   d2
  6119.   BEQ     CludgeCSFailed2
  6120.   !StoreResourceStencilMemInfo
  6121.   ;Make cookie
  6122.   !FinishResourceInit ; Have to do this before making stencil data
  6123.   !RemakeStencil{001}
  6124.   BRA     CludgeCSSkip
  6125. CludgeCSNoCookie
  6126.   !FinishResourceInit
  6127.   !WriteDefaultStencilInfo{004}
  6128. CludgeCSSkip
  6129.   TST.b   AutoChunkyShapesUse ; Use it?
  6130.   BEQ     CludgeCSDontUse ; No
  6131.   MOVE.w  d5,CurrentChunkyShape1 ; Yes, store shape number in current
  6132. CludgeCSDontUse
  6133.   MOVE.l  a2,a0 ; Base in a0
  6134.   MOVE.b  CShape_AutoClip,CRsrc_Clipping-ChunkyResources(a0)
  6135.   MOVE.b  CShape_AutoWrap,CRsrc_Wrapping-ChunkyResources(a0)
  6136.   !WriteDefaultClipData
  6137.   MOVE.l  CRsrc_Data-ChunkyResources(a0),d0 ; Success return value as data address (aligned)
  6138.   RTS     ; Successful, return
  6139.  
  6140. CludgeCSFailed
  6141.   MOVEQ.l #0,d0
  6142.   RTS     ; Return errorcode in d0
  6143. CludgeCSFailed2
  6144.   MOVE.l  a2,a0 ; Get base in a0
  6145.   MOVE.l  #-1,(a0) ; Dummy value so that it will deallocate data mem
  6146.   MOVE.b  #0,CRsrc_SHere-ChunkyResources(a0) ; In case stencil data previously exists, prevent attempted deallocation
  6147.   !DeallocResourceObject{009} ; Deallocate existing data
  6148.   MOVEQ.l #0,d0
  6149.   RTS     ; Return errorcode in d0
  6150.  
  6151. ;*************************************************************************************
  6152. _MCludgeBitmap
  6153. _MCludgeChunkyBitmap
  6154. ;Cludge a new ChunkyBitmap object from existing memory
  6155.   SUB.l   #16,d3 ; Prepare for alignment
  6156.   !RoundUpWidth{004} ; Make width multiple of 4
  6157.   !GetBitmapObjectPtr ; Get base of struct
  6158.   MOVE.l  a0,a2 ; Store base pointer
  6159.   !DeallocResourceObject{010} ; Deallocate existing data
  6160.   !InitData ; Shared setup
  6161.   MOVE.l  d3,d0 ; Put address in d0
  6162.   MOVE.l  a2,a0 ; Get base in a0
  6163.   !StoreResourceDataMemInfo2
  6164.   TST.b   CBitmap_AutoStencil ; Automatically make a stencil?
  6165.   BEQ     CludgeCBNoStencil
  6166.   MOVE.l  d4,d0 ; Get total bytes
  6167.   !NewChunkyMem{006} ; Returns address in d0
  6168.   MOVE.l  a2,a0
  6169.   TST.b   d2
  6170.   BEQ     CludgeCBFailed2
  6171.   !StoreResourceStencilMemInfo
  6172.   ;Make stencil
  6173.   !FinishResourceInit ; Have to do this before making stencil data
  6174.   !RemakeStencil{002}
  6175.   BRA     CludgeCBSkip
  6176. CludgeCBNoStencil
  6177.   !FinishResourceInit
  6178.   !WriteDefaultStencilInfo{005}
  6179. CludgeCBSkip
  6180.   TST.b   AutoChunkyBitmapsUse ; Use it?
  6181.   BEQ     InitCBDontUse ; No
  6182.   MOVE.w  d5,CurrentChunkyBitmap1 ; Yes, store shape number in current
  6183. CludgeCBDontUse
  6184.   MOVE.l  a2,a0 ; Base in a0
  6185.   MOVE.b  CBitmap_AutoClip,CRsrc_Clipping-ChunkyResources(a0)
  6186.   MOVE.b  CBitmap_AutoWrap,CRsrc_Wrapping-ChunkyResources(a0)
  6187.   !WriteDefaultClipData
  6188.   MOVE.l  CRsrc_Data-ChunkyResources(a0),d0 ; Success return value as data address (aligned)
  6189.   RTS     ; Successful, return
  6190.  
  6191. CludgeCBFailed
  6192.   MOVEQ.l #0,d0
  6193.   RTS     ; Return errorcode in d0
  6194. CludgeCBFailed2
  6195.   MOVE.l  a2,a0 ; Get base in a0
  6196.   MOVE.l  #-1,CRsrc_Width-ChunkyResources(a0) ; Dummy value so that it will deallocate data mem
  6197.   MOVE.b  #0,CRsrc_SHere-ChunkyResources(a0) ; In case stencil data previously exists, prevent attempted deallocation
  6198.   !DeallocResourceObject{011} ; Deallocate existing data
  6199.   MOVEQ.l #0,d0
  6200.   RTS     ; Return errorcode in d0
  6201.  
  6202. ;*************************************************************************************
  6203.  
  6204. _MAutoUsec2pWindows
  6205.   MOVE.b  d0,Autoc2pWindowsUse
  6206.   RTS
  6207.  
  6208. ;*************************************************************************************
  6209. _MAutoUseShapes
  6210. _MAutoUseChunkyShapes
  6211.   MOVE.b  d0,AutoChunkyShapesUse
  6212.   RTS
  6213.  
  6214. ;*************************************************************************************
  6215. _MAutoUseBitmaps
  6216. _MAutoUseChunkyBitmaps
  6217.   MOVE.b  d0,AutoChunkyBitmapsUse
  6218.   RTS
  6219.  
  6220. ;*************************************************************************************
  6221.  
  6222. _MMakeChunkyShapeCookiesShort
  6223.   MOVEQ.l #0,d0 ; First
  6224.   MOVE.w  ChunkyShapesTotal,d1
  6225.   SUBQ.w  #1,d1 ; Last
  6226. _MMakeCookies
  6227. _MMakeChunkyShapeCookies
  6228. ;Make cookies for all or a range of ChunkyShape objects
  6229.   SUB.w   d0,d1 ; Total
  6230.   MOVE.w  d1,d3 ; Loopcounter, no need for -1
  6231.   MOVE.w  d0,d5 ; Start offset
  6232. MMCSCsloop
  6233.   MOVE.w  d3,d0 ; Current
  6234.   ADD.w   d5,d0 ; StartOffset+Current
  6235.   BSR     _MMakeChunkyShapeCookie ; Make cookie
  6236.   DBRA    d3,MMCSCsloop
  6237. MMCSCsSskip
  6238.   RTS
  6239. _MMakeCookie
  6240. _MMakeChunkyShapeCookie
  6241. ;Make a new cookie for a ChunkyShape
  6242.   !GetShapeObjectPtr ; Base in a0
  6243.   TST.l   CRsrc_Width-ChunkyResources(a0) ; Active shape?
  6244.   BEQ     MMCSCookSkip
  6245.   !PrepareStencilMemory{001} ; Get suitable mem
  6246.   TST.b   d2 ; Success?
  6247.   BEQ     MMCSCSfailed
  6248.   ;Got mem, now make data
  6249.   !RemakeStencil{003}
  6250. MMCSCSfailed
  6251. MMCSCookSkip
  6252.   RTS
  6253.  
  6254. ;*************************************************************************************
  6255.  
  6256. _MMakeChunkyBitmapStencilsShort
  6257.   MOVEQ.l #0,d0 ; First
  6258.   MOVE.w  ChunkyBitmapsTotal,d1
  6259.   SUBQ.w  #1,d1 ; Last
  6260. _MMakeStencils
  6261. _MMakeChunkyBitmapStencils
  6262. ;Make stencils for all or a range of ChunkyBitmap objects
  6263.   SUB.w   d0,d1 ; Total
  6264.   MOVE.w  d1,d3 ; Loopcounter, no need for -1
  6265.   MOVE.w  d0,d5 ; Start offset
  6266. MMCBSsloop
  6267.   MOVE.w  d3,d0 ; Current
  6268.   ADD.w   d5,d0 ; StartOffset+Current
  6269.   BSR     _MMakeChunkyBitmapStencil ; Make stencil
  6270.   DBRA    d3,MMCBSsloop
  6271. MMCBSsSskip
  6272.   RTS
  6273. _MMakeStencil
  6274. _MMakeChunkyBitmapStencil
  6275. ;Make a new stencil for a ChunkyBitmap
  6276.   !GetBitmapObjectPtr ; Base in a0
  6277.   TST.l   CRsrc_Width-ChunkyResources(a0) ; Active bitmap?
  6278.   BEQ     MMCBStenSkip
  6279.   !PrepareStencilMemory{002} ; Get suitable mem
  6280.   TST.b   d2 ; Success?
  6281.   BEQ     MMCBSSfailed
  6282.   ;Got mem, now make data
  6283.   !RemakeStencil{004}
  6284. MMCBSSfailed
  6285. MMCBStenSkip
  6286.   RTS
  6287.  
  6288. ;*************************************************************************************
  6289.  
  6290. _MFreeChunkyShapeCookiesRange
  6291. ;Free a range of ChunkyShape object's cookies
  6292.   SUB.w   d0,d1 ; Total
  6293.   MOVE.w  d1,d7 ; Loopcounter, no need for -1
  6294.   MOVE.w  d0,d4 ; Start offset
  6295. FreeCSCsRloop
  6296.   MOVE.w  d7,d0
  6297.   ADD.w   d4,d0
  6298.   BSR     _MFreeChunkyShapeCookie ; Free it
  6299.   DBRA    d7,FreeCSCsRloop
  6300.   RTS
  6301. _MFreeCookies
  6302. _MFreeChunkyShapeCookies
  6303. ;Free all ChunkyShape object's cookies
  6304.   MOVE.w  ChunkyShapesTotal,d7
  6305.   SUBQ.w  #1,d7 ; loopcounter
  6306. FreeCSCsloop
  6307.   MOVE.w  d7,d0
  6308.   BSR     _MFreeChunkyShapeCookie ; Free it
  6309.   DBRA    d7,FreeCSCsloop
  6310.   RTS
  6311. _MFreeCookie
  6312. _MFreeChunkyShapeCookie
  6313. ;Free any memory reserved for a stencil and clear info
  6314.   !GetShapeObjectPtr ; Base in a0
  6315.   TST.l   CRsrc_Width-ChunkyResources(a0) ; Active shape?
  6316.   BEQ     MFreeCSCskip
  6317.   !FreeStencilMem{001}
  6318. MFreeCSCskip
  6319.   RTS
  6320.  
  6321. ;*************************************************************************************
  6322.  
  6323. _MFreeChunkyBitmapStencilsRange
  6324. ;Free a range of ChunkyBitmap object's stencils
  6325.   SUB.w   d0,d1 ; Total
  6326.   MOVE.w  d1,d7 ; Loopcounter, no need for -1
  6327.   MOVE.w  d0,d4 ; Start offset
  6328. FreeCBSsRloop
  6329.   MOVE.w  d7,d0
  6330.   ADD.w   d4,d0
  6331.   BSR     _MFreeChunkyBitmapStencil ; Free it
  6332.   DBRA    d7,FreeCBSsRloop
  6333.   RTS
  6334. _MFreeStencils
  6335. _MFreeChunkyBitmapStencils
  6336. ;Free all ChunkyBitmap object's stencils
  6337.   MOVE.w  ChunkyBitmapsTotal,d7
  6338.   SUBQ.w  #1,d7 ; loopcounter
  6339. FreeCBSsloop
  6340.   MOVE.l  d7,d0
  6341.   BSR     _MFreeChunkyBitmapStencil ; Free it
  6342.   DBRA    d7,FreeCBSsloop
  6343.   RTS
  6344. _MFreeStencil
  6345. _MFreeChunkyBitmapStencil
  6346. ;Free any memory reserved for a stencil and clear info
  6347.   !GetBitmapObjectPtr ; Base in a0
  6348.   TST.l   CRsrc_Width-ChunkyResources(a0) ; Active bitmap?
  6349.   BEQ     MFreeCBSskip
  6350.   !FreeStencilMem{002}
  6351. MFreeCBSskip
  6352.   RTS
  6353.  
  6354. ;*************************************************************************************
  6355. _MAutoShapeWrap
  6356. _MAutoChunkyShapeWrapping
  6357. ;Switch on/off ChunkyShape Auto X&Y handle-wrapping feature
  6358.   MOVE.b  d0,CShape_AutoWrap
  6359.   RTS
  6360.  
  6361. ;*************************************************************************************
  6362. _MAutoBitmapWrap
  6363. _MAutoChunkyBitmapWrapping
  6364. ;Switch on/off ChunkyBitmap Auto X&Y handle-wrapping feature
  6365.   MOVE.b  d0,CBitmap_AutoWrap
  6366.   RTS
  6367.  
  6368. ;*************************************************************************************
  6369. _MShapeWrap
  6370. _MChunkyShapeWrapping
  6371. ;Switch on/off X&Y handle-wrapping for a ChunkyShape
  6372.   !GetShapeObjectPtr ; Base in a0
  6373.   MOVE.b  d1,CRsrc_Wrapping-ChunkyResources(a0)
  6374.   RTS
  6375.  
  6376. ;*************************************************************************************
  6377. _MBitmapWrap
  6378. _MChunkyBitmapWrapping
  6379. ;Switch on/off X&Y handle-wrapping for a ChunkyBitmap
  6380.   !GetBitmapObjectPtr ; Base in a0
  6381.   MOVE.b  d1,CRsrc_Wrapping-ChunkyResources(a0)
  6382.   RTS
  6383.  
  6384. ;*************************************************************************************
  6385. _MCludgeShapeStruct
  6386. _MCludgeChunkyShapeStruct
  6387. ;Cludge a new ChunkyShape from an existing one but don't copy any graphic/stencil data
  6388.   MOVE.w  d1,-(a7) ; Store dest Shape#
  6389.   !CopyCShapeDat{001}
  6390.   MOVE.w  (a7)+,d1 ; Restore dest Shape#
  6391.   TST.b   AutoChunkyShapesUse ; Use it?
  6392.   BEQ     MCCSStructDontUse ; No
  6393.   MOVE.w  d1,CurrentChunkyShape1 ; Yes, store shape number in current
  6394. MCCSStructDontUse
  6395.   MOVE.l  CRsrc_Data-ChunkyResources(a1),d0 ; Return start of useable data
  6396.   RTS
  6397.  
  6398. ;*************************************************************************************
  6399. _MCludgeBitmapStruct
  6400. _MCludgeChunkyBitmapStruct
  6401. ;Cludge a new ChunkyBitmap from an existing one but don't copy any graphic/stencil data
  6402.   MOVE.w  d1,-(a7) ; Store dest Bitmap#
  6403.   !CopyCBitmapDat{001}
  6404.   MOVE.w  (a7)+,d1 ; Restore dest Bitmap#
  6405.   TST.b   AutoChunkyBitmapsUse ; Use it?
  6406.   BEQ     MCCBStructDontUse ; No
  6407.   MOVE.w  d1,CurrentChunkyBitmap1 ; Yes, store bitmap number in current
  6408. MCCBStructDontUse
  6409.   MOVE.l  CRsrc_Data-ChunkyResources(a1),d0 ; Return start of useable data
  6410.   RTS
  6411.  
  6412. ;*************************************************************************************
  6413. _MCopyc2pWindow
  6414. _MCopyc2pWindowStruct
  6415. ;Creat a new c2pWindow from an existing one, copying only definition data
  6416.   EXG.l   d0,d1
  6417.   !Getc2pWindowObjectPtr ; Base in a0
  6418.   EXG.l   d0,d1
  6419.   MOVE.l  a0,a1 ; Dest
  6420.   !Getc2pWindowObjectPtr ; Base in a0 - Source
  6421.   MOVE.w  c2p0_Pixels-c2pWindows(a0),c2p0_Pixels-c2pWindows(a1)
  6422.   MOVE.w  c2p0_RowsStore-c2pWindows(a0),c2p0_RowsStore-c2pWindows(a1)
  6423.   MOVE.w  c2p0_Cmod-c2pWindows(a0),c2p0_Cmod-c2pWindows(a1)
  6424.   MOVE.w  c2p0_Pmod-c2pWindows(a0),c2p0_Pmod-c2pWindows(a1)
  6425.   TST.b   Autoc2pWindowsUse ; Use it?
  6426.   BEQ     _MCopyc2pWindowStructDontUse ; No
  6427.   MOVE.w  d1,Currentc2pWindow1 ; Yes, store c2pWindow number in current
  6428. _MCopyc2pWindowStructDontUse
  6429.   RTS
  6430.  
  6431. ;*************************************************************************************
  6432. _MShapeWindow
  6433. _MChunkyShapeWindow
  6434. ;Cludge a new ChunkyShape window inside an existing one (not larger)
  6435.   MOVE.w  d1,-(a7) ; Store dest Shape#
  6436.   !CopyCShapeDat{002}
  6437.   !CludgeResourceWindow{001}
  6438.   MOVE.w  (a7)+,d1 ; Restore dest Shape#
  6439.   TST.l   d0 ; Errorskip?
  6440.   BEQ     MCCSWindowDontUse
  6441.   TST.b   AutoChunkyShapesUse ; Use it?
  6442.   BEQ     MCCSWindowDontUse ; No
  6443.   MOVE.w  d1,CurrentChunkyShape1 ; Yes, store shape number in current
  6444. MCCSWindowDontUse
  6445.   RTS     ; Returns address or error in d0
  6446.  
  6447. ;*************************************************************************************
  6448. _MBitmapWindow
  6449. _MChunkyBitmapWindow
  6450. ;Cludge a new ChunkyBitmap window inside an existing one (not larger)
  6451.   MOVE.w  d1,-(a7) ; Store dest Bitmap#
  6452.   !CopyCBitmapDat{002}
  6453.   !CludgeResourceWindow{002}
  6454.   MOVE.w  (a7)+,d1 ; Restore dest Bitmap#
  6455.   TST.l   d0 ; Errorskip?
  6456.   BEQ     MCCBWindowDontUse
  6457.   TST.b   AutoChunkyBitmapsUse ; Use it?
  6458.   BEQ     MCCBWindowDontUse ; No
  6459.   MOVE.w  d1,CurrentChunkyBitmap1 ; Yes, store bitmap number in current
  6460. MCCBWindowDontUse
  6461.   RTS     ; Returns address or error in d0
  6462.  
  6463. ;*************************************************************************************
  6464. _MBitmapShape
  6465. _MChunkyBitmapShape
  6466. ;Cludge a new ChunkyShape from an existing ChunkyBitmap but don't copy graphic/stencil data
  6467.   MOVE.w  d1,-(a7) ; Store dest Shape#
  6468.   !CopyCBitmapDatToCShape{001}
  6469.   MOVE.w  (a7)+,d1 ; Restore dest Shape#
  6470.   TST.b   AutoChunkyShapesUse ; Use it?
  6471.   BEQ     MCBShapeDontUse ; No
  6472.   MOVE.w  d1,CurrentChunkyShape1 ; Yes, store shape number in current
  6473. MCBShapeDontUse
  6474.   MOVE.l  CRsrc_Data-ChunkyResources(a1),d0 ; Return start of useable data
  6475.   RTS
  6476.  
  6477. ;*************************************************************************************
  6478. _MShapesBitmap
  6479. _MChunkyShapesBitmap
  6480. ;Cludge a new ChunkyBitmap from an existing ChunkyShape but don't copy graphic/stencil data
  6481.   MOVE.w  d1,-(a7) ; Store dest Bitmap#
  6482.   !CopyCShapeDatToCBitmap{001}
  6483.   MOVE.w  (a7)+,d1 ; Restore dest Bitmap#
  6484.   TST.b   AutoChunkyBitmapsUse ; Use it?
  6485.   BEQ     MCSBitmapDontUse ; No
  6486.   MOVE.w  d1,CurrentChunkyBitmap1 ; Yes, store bitmap number in current
  6487. MCSBitmapDontUse
  6488.   MOVE.l  CRsrc_Data-ChunkyResources(a1),d0 ; Return start of useable data
  6489.   RTS
  6490.  
  6491. ;*************************************************************************************
  6492. _MAutoCookieXFlip
  6493. _MAutoChunkyCookieXFlip
  6494. ;Switch on/off ChunkyShape's cookie Auto X-flipping feature
  6495.   MOVE.b  d0,CCookie_AutoXFlip
  6496.   RTS
  6497.  
  6498. ;*************************************************************************************
  6499. _MAutoCookieYFlip
  6500. _MAutoChunkyCookieYFlip
  6501. ;Switch on/off ChunkyShape's cookie Auto Y-flipping feature
  6502.   MOVE.b  d0,CCookie_AutoYFlip
  6503.   RTS
  6504.  
  6505. ;*************************************************************************************
  6506. _MAutoStencilXFlip
  6507. _MAutoChunkyStencilXFlip
  6508. ;Switch on/off ChunkyBitmap's stencil Auto X-flipping feature
  6509.   MOVE.b  d0,CStencil_AutoXFlip
  6510.   RTS
  6511.  
  6512. ;*************************************************************************************
  6513. _MAutoStencilYFlip
  6514. _MAutoChunkyStencilYFlip
  6515. ;Switch on/off ChunkyBitmap's stencil Auto Y-flipping feature
  6516.   MOVE.b  d0,CStencil_AutoYFlip
  6517.   RTS
  6518.  
  6519. ;*************************************************************************************
  6520. _MAutoCookieFlip
  6521. _MAutoChunkyCookieFlipping
  6522. ;Switch on/off ChunkyShape's cookie Auto X&Y flipping feature
  6523.   MOVE.b  d0,CCookie_AutoXFlip
  6524.   MOVE.b  d0,CCookie_AutoYFlip
  6525.   RTS
  6526.  
  6527. ;*************************************************************************************
  6528. _MAutoStencilFlip
  6529. _MAutoChunkyStencilFlipping
  6530. ;Switch on/off ChunkyBitmap's stencil Auto X&Y flipping feature
  6531.   MOVE.b  d0,CStencil_AutoXFlip
  6532.   MOVE.b  d0,CStencil_AutoYFlip
  6533.   RTS
  6534.  
  6535. ;*************************************************************************************
  6536. _MShapeXFlip
  6537. _MChunkyShapeXFlip
  6538. ;Flip a ChunkyShape horizontally and also possibly it's cookie
  6539.   !GetShapeObjectPtr ; Base in a0
  6540.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1
  6541.   BSR     InitialiseRegs2
  6542.   !PerformXFlip{001}
  6543.   TST.b   CCookie_AutoXFlip
  6544.   BEQ     MCSXFlipSkip
  6545.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has cookie?
  6546.   BEQ     MCSXFlipSkip
  6547.   BRA     _MChunkyCookieXFlipEntry ; ignore rts
  6548. MCSXFlipSkip
  6549.   RTS
  6550.  
  6551. ;*************************************************************************************
  6552. _MShapeYFlip
  6553. _MChunkyShapeYFlip
  6554. ;Flip a ChunkyShape vertically and also possibly it's cookie
  6555.   !GetShapeObjectPtr ; Base in a0
  6556.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1
  6557.   BSR     InitialiseRegs2
  6558.   !PerformYFlip{001}
  6559.   TST.b   CCookie_AutoYFlip
  6560.   BEQ     MCSYFlipSkip
  6561.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has cookie?
  6562.   BEQ     MCSYFlipSkip
  6563.   BRA     _MChunkyCookieYFlipEntry ; ignore rts
  6564. MCSYFlipSkip
  6565.   RTS
  6566.  
  6567. ;*************************************************************************************
  6568. _MBitmapXFlip
  6569. _MChunkyBitmapXFlip
  6570. ;Flip a ChunkyBitmap horizonally and also possibly it's stencil
  6571.   !GetBitmapObjectPtr ; Base in a0
  6572.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1
  6573.   BSR     InitialiseRegs2
  6574.   !PerformXFlip{002}
  6575.   TST.b   CStencil_AutoXFlip
  6576.   BEQ     MCBXFlipSkip
  6577.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has stencil?
  6578.   BEQ     MCBXFlipSkip
  6579.   BRA     _MChunkyBitmapXFlipEntry ; ignore rts
  6580. MCBXFlipSkip
  6581.   RTS
  6582.  
  6583. ;*************************************************************************************
  6584. _MBitmapYFlip
  6585. _MChunkyBitmapYFlip
  6586. ;Flip a ChunkyBitmap vertically and also possibly it's stencil
  6587.   !GetBitmapObjectPtr ; Base in a0
  6588.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1
  6589.   BSR     InitialiseRegs2
  6590.   !PerformYFlip{002}
  6591.   TST.b   CStencil_AutoYFlip
  6592.   BEQ     MCBYFlipSkip
  6593.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has stencil?
  6594.   BEQ     MCBYFlipSkip
  6595.   BRA     _MChunkyBitmapYFlipEntry ; ignore rts
  6596. MCBYFlipSkip
  6597.   RTS
  6598.  
  6599. ;*************************************************************************************
  6600. _MCookieXFlip
  6601. _MChunkyCookieXFlip
  6602. ;Flip a ChunkyShape's cookie horizontally
  6603.   !GetShapeObjectPtr ; Base in a0
  6604. _MChunkyCookieXFlipEntry ; Entry point for _MChunkyShapeXFlip
  6605.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a1
  6606.   BSR     InitialiseRegs2
  6607.   !PerformXFlip{003}
  6608.   RTS
  6609.  
  6610. ;*************************************************************************************
  6611. _MCookieYFlip
  6612. _MChunkyCookieYFlip
  6613. ;Flip a ChunkyShape's cookie vertically
  6614.   !GetShapeObjectPtr ; Base in a0
  6615. _MChunkyCookieYFlipEntry ; Entry point for _MChunkyShapeYFlip
  6616.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a1
  6617.   BSR     InitialiseRegs2
  6618.   !PerformYFlip{003}
  6619.   RTS
  6620.  
  6621. ;*************************************************************************************
  6622. _MStencilXFlip
  6623. _MChunkyStencilXFlip
  6624. ;Flip a ChunkyBitmap's stencil horizontally
  6625.   !GetBitmapObjectPtr ; Base in a0
  6626. _MChunkyBitmapXFlipEntry ; Entry point for _MChunkyBitmapXFlip
  6627.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a1
  6628.   BSR     InitialiseRegs2
  6629.   !PerformXFlip{004}
  6630.   RTS
  6631.  
  6632. ;*************************************************************************************
  6633. _MStencilYFlip
  6634. _MChunkyStencilYFlip
  6635. ;Flip a ChunkyBitmap's stencil vertically
  6636.   !GetBitmapObjectPtr ; Base in a0
  6637. _MChunkyBitmapYFlipEntry ; Entry point for _MChunkyBitmapYFlip
  6638.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a1
  6639.   BSR     InitialiseRegs2
  6640.   !PerformYFlip{004}
  6641.   RTS
  6642.  
  6643. ;*************************************************************************************
  6644. _MAutoShapeClip
  6645. _MAutoChunkyShapeClipping
  6646. ;Switch on/off ChunkyShape Auto-Clip feature
  6647.   MOVE.b  d0,CShape_AutoClip
  6648.   RTS
  6649.  
  6650. ;*************************************************************************************
  6651. _MAutoBitmapClip
  6652. _MAutoChunkyBitmapClipping
  6653. ;Switch on/off ChunkyBitmap Auto-Clip feature
  6654.   MOVE.b  d0,CBitmap_AutoClip
  6655.   RTS
  6656.  
  6657. ;*************************************************************************************
  6658.  
  6659. _MChunkyShapeClipSwitch
  6660.   !GetShapeObjectPtr ; Base in a0
  6661.   MOVE.b  d1,CRsrc_Clipping-ChunkyResources(a0)
  6662.   RTS
  6663. _MChunkyShapeClipShort
  6664.   MOVE.b  CShape_AutoClip,d5
  6665. _MShapeClip
  6666. _MChunkyShapeClip
  6667. ;Define the clip window of an existing ChunkyShape, within its limits
  6668.   !GetShapeObjectPtr ; Base in a0
  6669.   EXG.l   d3,d1
  6670.   !RoundUpWidth{007} ; Make Width multiple of 4
  6671.   EXG.l   d3,d1
  6672. ;  !RoundUpWidth{008} ; Make X multiple of 4
  6673.   !WriteClipWindowData
  6674.   RTS
  6675.  
  6676. ;*************************************************************************************
  6677.  
  6678. _MChunkyBitmapClipSwitch
  6679.   !GetBitmapObjectPtr ; Base in a0
  6680.   MOVE.b  d1,CRsrc_Clipping-ChunkyResources(a0)
  6681.   RTS
  6682. _MChunkyBitmapClipShort
  6683.   MOVE.b  CBitmap_AutoClip,d5
  6684. _MBitmapClip
  6685. _MChunkyBitmapClip
  6686. ;Define the clip window of an existing ChunkyBitmap, within its limits
  6687.   !GetBitmapObjectPtr ; Base in a0
  6688.   EXG.l   d3,d1
  6689.   !RoundUpWidth{009} ; Make Width multiple of 4
  6690.   EXG.l   d3,d1
  6691. ;  !RoundUpWidth{010} ; Make X multiple of 4
  6692.   !WriteClipWindowData
  6693.   RTS
  6694.  
  6695. ;*************************************************************************************
  6696.  
  6697. _MGetaChunkyShapeShort
  6698.   MOVEQ.l #0,d5 ; Init Block On/Off param, default to off
  6699.   MOVEQ.l #0,d6 ; Init StencilIsCookie On/Off param, default to off
  6700. _MGetaShape
  6701. _MGetaChunkyShape
  6702. ;Create a new ChunkyShape from an existing ChunkyBitmap and copy graphic/stencil data, maybe with block routines
  6703.   TST.b   d5 ; Block routines?
  6704.   BEQ     _MGetaCSSkip
  6705.   AND.b   #$F0,d1 ; Crop X down to nearest 16
  6706.   AND.b   #$F0,d3 ; Copy Width down to nearest 16
  6707.   BGT     _MGetaCSSkip
  6708.   MOVEQ.l #16,d3 ; Make sure width at least 16
  6709. _MGetaCSSkip
  6710.   MOVEM.w d0-d6,-(a7) ; Store
  6711.   MOVE.w  d3,d1 ; Prepare width
  6712.   MOVE.w  d4,d2 ; Prepare height
  6713.   BSR     _MChunkyShape
  6714.   MOVE.l  d0,d7 ; Store result
  6715.   MOVEM.w (a7)+,d0-d6 ; Restore
  6716.   TST.l   d7 ; Error?
  6717.   BEQ     MGetaCSError
  6718.   MOVE.w  CurrentChunkyShape1,d7 ; Store
  6719.   MOVE.w  d0,CurrentChunkyShape1
  6720.   MOVEM.w d0-d6,-(a7) ; Store
  6721.   MOVE.l  d7,-(a7) ; Store
  6722.   TST.b   d5 ; Block routines?
  6723.   BEQ     _MGetaCSNotBlock
  6724. _MGetaCSBlock
  6725.   !ShuffleRegs2
  6726.   BSR     _MBlockScrollBitmapToShapeShort
  6727.   BRA     _MGetaCSSkip2
  6728. _MGetaCSNotBlock
  6729.   !ShuffleRegs2
  6730.   BSR     _MScrollBitmapToShapeShort
  6731. _MGetaCSSkip2
  6732.   MOVE.l  (a7)+,d7 ; Restore
  6733.   MOVEM.w (a7)+,d0-d6 ; Restore
  6734.   MOVE.w  d7,CurrentChunkyShape1 ; Restore
  6735.   TST.b   CShape_AutoCookie
  6736.   BEQ     MGetaCSDone
  6737.   TST.b   d6 ; Try and grab existing stencil?
  6738.   BEQ     _MGetaCSTryMaking
  6739.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Source has stencil?
  6740.   BEQ     _MGetaCSTryMaking ; Doesn't have one, so try and make one
  6741.   TST.l   CRsrc_SMem-ChunkyResources(a1) ; Dest has cookie?
  6742.   BEQ     MGetaCSError2 ; Doesn't have one so can't complete operation
  6743.   MOVE.w  CurrentChunkyShape1,d7 ; Store
  6744.   MOVE.w  d0,CurrentChunkyShape1
  6745.   MOVEM.w d0-d6,-(a7) ; Store
  6746.   MOVE.l  d7,-(a7) ; Store
  6747.   TST.b   d5 ; Block routines?
  6748.   BEQ     _MGetaCSNotBlock2
  6749. _MGetaCSBlock2
  6750.   !ShuffleRegs2
  6751.   BSR     _MBlockScrollStencilToCookieShort
  6752.   BRA     _MGetaCSSkip3
  6753. _MGetaCSNotBlock2
  6754.   !ShuffleRegs2
  6755.   BSR     _MScrollStencilToCookieShort
  6756. _MGetaCSSkip3
  6757.   MOVE.l  (a7)+,d7 ; Restore
  6758.   MOVEM.w (a7)+,d0-d6 ; Restore
  6759.   MOVE.w  d7,CurrentChunkyShape1 ; Restore
  6760.   BRA     MGetaCSDone
  6761. _MGetaCSTryMaking
  6762.   MOVE.w  d0,-(a7) ; Store
  6763.   BSR     _MMakeChunkyShapeCookie
  6764.   MOVE.w  (a7)+,d0 ; Restore
  6765. MGetaCSDone
  6766.   !GetShapeObjectPtr ; Base in a0
  6767.   MOVE.l  CRsrc_Data-ChunkyResources(a0),d0 ; Return address of data as success
  6768. _MGetaCSSkip4
  6769.   RTS
  6770. MGetaCSError
  6771.   MOVEQ.l #0,d0 ; Error
  6772.   RTS
  6773. MGetaCSError2
  6774.   !GetShapeObjectPtr ; Base in a0
  6775.   !DeallocResourceObject{012} ; Kill
  6776.   RTS
  6777.  
  6778. ;*************************************************************************************
  6779.  
  6780. _MGetaChunkyBitmapShort
  6781.   MOVEQ.l #0,d5 ; Init Block On/Off param, default to off
  6782.   MOVEQ.l #0,d6 ; Init CookieIsStencil On/Off param, default to off
  6783. _MGetaBitmap
  6784. _MGetaChunkyBitmap
  6785. ;Create a new ChunkyBitmap from an existing ChunkyShape and copy graphic/stencil data, maybe with block routines
  6786.   TST.b   d5 ; Block routines?
  6787.   BEQ     _MGetaCBSkip
  6788.   AND.b   #$F0,d1 ; Crop X down to nearest 16
  6789.   AND.b   #$F0,d3 ; Copy Width down to nearest 16
  6790.   BGT     _MGetaCBSkip
  6791.   MOVEQ.l #16,d3 ; Make sure width at least 16
  6792. _MGetaCBSkip
  6793.   MOVEM.w d0-d6,-(a7) ; Store
  6794.   MOVE.w  d3,d1 ; Prepare width
  6795.   MOVE.w  d4,d2 ; Prepare height
  6796.   BSR     _MChunkyBitmap
  6797.   MOVE.l  d0,d7 ; Store result
  6798.   MOVEM.w (a7)+,d0-d6 ; Restore
  6799.   TST.l   d7 ; Error?
  6800.   BEQ     MGetaCBError
  6801.   MOVE.w  CurrentChunkyBitmap1,d7 ; Store
  6802.   MOVE.w  d0,CurrentChunkyBitmap1
  6803.   MOVEM.w d0-d6,-(a7) ; Store
  6804.   MOVE.l  d7,-(a7) ; Store
  6805.   TST.b   d5 ; Block routines?
  6806.   BEQ     _MGetaCBNotBlock
  6807. _MGetaCBBlock
  6808.   !ShuffleRegs2
  6809.   BSR     _MBlockScrollShapeToBitmapShort
  6810.   BRA     _MGetaCBSkip2
  6811. _MGetaCBNotBlock
  6812.   !ShuffleRegs2
  6813.   BSR     _MScrollShapeToBitmapShort
  6814. _MGetaCBSkip2
  6815.   MOVE.l  (a7)+,d7 ; Restore
  6816.   MOVEM.w (a7)+,d0-d6 ; Restore
  6817.   MOVE.w  d7,CurrentChunkyBitmap1 ; Restore
  6818.   TST.b   CBitmap_AutoStencil
  6819.   BEQ     MGetaCBDone
  6820.   TST.b   d6 ; Try and grab existing cookie?
  6821.   BEQ     _MGetaCBTryMaking
  6822.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Source has cookie?
  6823.   BEQ     _MGetaCBTryMaking ; Doesn't have one, so try and make one
  6824.   TST.l   CRsrc_SMem-ChunkyResources(a1) ; Dest has stencil?
  6825.   BEQ     MGetaCBError2 ; Doesn't have one so can't complete operation
  6826.   MOVE.w  CurrentChunkyBitmap1,d7 ; Store
  6827.   MOVE.w  d0,CurrentChunkyBitmap1
  6828.   MOVEM.w d0-d6,-(a7) ; Store
  6829.   MOVE.l  d7,-(a7) ; Store
  6830.   TST.b   d5 ; Block routines?
  6831.   BEQ     _MGetaCBNotBlock2
  6832. _MGetaCBBlock2
  6833.   !ShuffleRegs2
  6834.   BSR     _MBlockScrollCookieToStencilShort
  6835.   BRA     _MGetaCBSkip3
  6836. _MGetaCBNotBlock2
  6837.   !ShuffleRegs2
  6838.   BSR     _MScrollCookieToStencilShort
  6839. _MGetaCBSkip3
  6840.   MOVE.l  (a7)+,d7 ; Restore
  6841.   MOVEM.w (a7)+,d0-d6 ; Restore
  6842.   MOVE.w  d7,CurrentChunkyBitmap1 ; Restore
  6843.   BRA     MGetaCBDone
  6844. _MGetaCBTryMaking
  6845.   MOVE.w  d0,-(a7) ; Store
  6846.   BSR     _MMakeChunkyBitmapStencil
  6847.   MOVE.w  (a7)+,d0 ; Restore
  6848. MGetaCBDone
  6849.   !GetBitmapObjectPtr ; Base in a0
  6850.   MOVE.l  CRsrc_Data-ChunkyResources(a0),d0 ; Return address of data as success
  6851. _MGetaCBSkip4
  6852.   RTS
  6853. MGetaCBError
  6854.   MOVEQ.l #0,d0 ; Error
  6855.   RTS
  6856. MGetaCBError2
  6857.   !GetBitmapObjectPtr ; Base in a0
  6858.   !DeallocResourceObject{013} ; Kill
  6859.   RTS
  6860.  
  6861. ;*************************************************************************************
  6862.  
  6863. _MScrollShort
  6864.   MOVE.w  CurrentChunkyBitmap1,d6
  6865. _MScroll
  6866. ;Scroll an area of the bitmap from one place to another, possibly different source bitmap
  6867.   !SetupScroll{4,ChunkyBitmap1,ScrollBitmap,5,_MScroll,001}
  6868. _MScrollCustom
  6869.   !SetupScroll2{4,ChunkyBitmap1,ScrollBitmap,5,_MScroll,001}
  6870.  
  6871. _MScrollShapeShort
  6872.   MOVE.w  CurrentChunkyShape1,d6
  6873. _MScrollShape
  6874. ;Scroll an area of the shape from one place to another, possibly different source shape
  6875.   !SetupScroll{4,ChunkyShape1,ScrollShape,5,_MScroll,002}
  6876. _MScrollShapeCustom
  6877.   !SetupScroll2{4,ChunkyShape1,ScrollShape,5,_MScroll,002}
  6878.  
  6879. _MScrollStencilShort
  6880.   MOVE.w  CurrentChunkyBitmap1,d6
  6881. _MScrollStencil
  6882. ;Scroll an area of the stencil from one place to another, possibly different source stencil
  6883.   !SetupScroll{4,ChunkyBitmap1,ScrollBitmap,6,_MScroll,003}
  6884. _MScrollStencilCustom
  6885.   !SetupScroll2{4,ChunkyBitmap1,ScrollBitmap,6,_MScroll,003}
  6886.  
  6887. _MScrollCookieShort
  6888.   MOVE.w  CurrentChunkyShape1,d6
  6889. _MScrollCookie
  6890. ;Scroll an area of the cookie from one place to another, possibly different source cookie
  6891.   !SetupScroll{4,ChunkyShape1,ScrollShape,6,_MScroll,004}
  6892. _MScrollCookieCustom
  6893.   !SetupScroll2{4,ChunkyShape1,ScrollShape,6,_MScroll,004}
  6894.  
  6895. _MScrollBitmapToShapeShort
  6896.   MOVE.w  CurrentChunkyBitmap1,d6
  6897. _MScrollBitmapToShape
  6898. ;Scroll an area of the bitmap from one place to an area in shape
  6899.   !SetupScroll{4,ChunkyShape1,ScrollBitmapToShape,5,_MScroll,005}
  6900. _MScrollBitmapToShapeCustom
  6901.   !SetupScroll2{4,ChunkyShape1,ScrollBitmapToShape,5,_MScroll,005}
  6902.  
  6903. _MScrollShapeToBitmapShort
  6904.   MOVE.w  CurrentChunkyShape1,d6
  6905. _MScrollShapeToBitmap
  6906. ;Scroll an area of the shape from one place to an area in a bitmap
  6907.   !SetupScroll{4,ChunkyBitmap1,ScrollShapeToBitmap,5,_MScroll,006}
  6908. _MScrollShapeToBitmapCustom
  6909.   !SetupScroll2{4,ChunkyBitmap1,ScrollShapeToBitmap,5,_MScroll,006}
  6910.  
  6911. _MScrollStencilToCookieShort
  6912.   MOVE.w  CurrentChunkyBitmap1,d6
  6913. _MScrollStencilToCookie
  6914. ;Scroll an area of the stencil from one place to an area in cookie
  6915.   !SetupScroll{4,ChunkyShape1,ScrollBitmapToShape,6,_MScroll,007}
  6916. _MScrollStencilToCookieCustom
  6917.   !SetupScroll2{4,ChunkyShape1,ScrollBitmapToShape,6,_MScroll,007}
  6918.  
  6919. _MScrollCookieToStencilShort
  6920.   MOVE.w  CurrentChunkyShape1,d6
  6921. _MScrollCookieToStencil
  6922. ;Scroll an area of the cookie from one place to an area in a stencil
  6923.   !SetupScroll{4,ChunkyBitmap1,ScrollShapeToBitmap,6,_MScroll,008}
  6924. _MScrollCookieToStencilCustom
  6925.   !SetupScroll2{4,ChunkyBitmap1,ScrollShapeToBitmap,6,_MScroll,008}
  6926.  
  6927. _MScrollRoutine
  6928.   !ChooseScrollMethod{2,001}
  6929. _MScrollRoutine2
  6930.   !ChooseScrollMethod2{2,001}
  6931.  
  6932. ;*************************************************************************************
  6933.  
  6934. _MStencilScrollShort
  6935.   MOVE.w  CurrentChunkyBitmap1,d6
  6936. _MMaskScroll
  6937. _MStencilScroll
  6938. ;Scroll an area of the bitmap from one place to another with stencilling, possibly different source bitmap
  6939.   !SetupScroll{1,ChunkyBitmap1,StenScroll,3,_MStenScroll,009}
  6940.  
  6941. _MCookieScrollShort
  6942.   MOVE.w  CurrentChunkyShape1,d6
  6943. _MMaskScrollShape
  6944. _MCookieScroll
  6945. ;Scroll an area of the Shape from one place to another with cookie-cut, possibly different source Shape
  6946.   !SetupScroll{1,ChunkyShape1,CookScroll,3,_MStenScroll,010}
  6947.  
  6948. _MStencilScrollStencilShort
  6949.   MOVE.w  CurrentChunkyBitmap1,d6
  6950. _MMaskScrollStencil
  6951. _MStencilScrollStencil
  6952. ;Scroll an area of the stencil from one place to another with stencilling, possibly different source stencil
  6953.   !SetupScroll{1,ChunkyBitmap1,StenScroll,4,_MStenScroll,011}
  6954.  
  6955. _MCookieScrollCookieShort
  6956.   MOVE.w  CurrentChunkyShape1,d6
  6957. _MMaskScrollCookie
  6958. _MCookieScrollCookie
  6959. ;Scroll an area of the Shape from one place to another with cookie-cut, possibly different source Shape
  6960.   !SetupScroll{1,ChunkyShape1,CookScroll,4,_MStenScroll,012}
  6961.  
  6962. _MStencilScrollBitmapToShapeShort
  6963.   MOVE.w  CurrentChunkyBitmap1,d6
  6964. _MMaskScrollBitmapToShape
  6965. _MStencilScrollBitmapToShape
  6966. ;Scroll an area of the bitmap from one place to an area in a shape with stencilling
  6967.   !SetupScroll{1,ChunkyShape1,StenScrollBitmapToShape,3,_MStenScroll,013}
  6968.  
  6969. _MCookieScrollShapeToBitmapShort
  6970.   MOVE.w  CurrentChunkyShape1,d6
  6971. _MMaskScrollShapeToBitmap
  6972. _MCookieScrollShapeToBitmap
  6973. ;Scroll an area of the Shape from one place to another with cookie-cut, possibly different source Shape
  6974.   !SetupScroll{1,ChunkyBitmap1,CookScrollShapeToBitmap,3,_MStenScroll,014}
  6975.  
  6976. _MStencilScrollStencilToCookieShort
  6977.   MOVE.w  CurrentChunkyBitmap1,d6
  6978. _MMaskScrollStencilToCookie
  6979. _MStencilScrollStencilToCookie
  6980. ;Scroll an area of the stencil from one place to an area in a cookie with stencilling
  6981.   !SetupScroll{1,ChunkyShape1,StenScrollBitmapToShape,4,_MStenScroll,015}
  6982.  
  6983. _MCookieScrollCookieToStencilShort
  6984.   MOVE.w  CurrentChunkyShape1,d6
  6985. _MMaskScrollCookieToStencil
  6986. _MCookieScrollCookieToStencil
  6987. ;Scroll an area of the Cookie from one place to an area in a stencil with cookie-cut
  6988.   !SetupScroll{1,ChunkyBitmap1,CookScrollShapeToBitmap,4,_MStenScroll,016}
  6989.  
  6990. _MStenScrollRoutine
  6991.   !ChooseScrollMethod{3,002}
  6992.  
  6993. ;*************************************************************************************
  6994.  
  6995. _MBlockScrollShort
  6996.   MOVE.w  CurrentChunkyBitmap1,d6
  6997. _MBlockScroll
  6998. ;BlockScroll an area of the bitmap from one place to another, possibly different source bitmap
  6999.   !SetupScroll{3,ChunkyBitmap1,ScrollBitmap,5,_MBlockScroll,017}
  7000.  
  7001. _MBlockScrollShapeShort
  7002.   MOVE.w  CurrentChunkyShape1,d6
  7003. _MBlockScrollShape
  7004. ;BlockScroll an area of the shape from one place to another, possibly different source shape
  7005.   !SetupScroll{3,ChunkyShape1,ScrollShape,5,_MBlockScroll,018}
  7006.  
  7007. _MBlockScrollStencilShort
  7008.   MOVE.w  CurrentChunkyBitmap1,d6
  7009. _MBlockScrollStencil
  7010. ;BlockScroll an area of the stencil from one place to another, possibly different source stencil
  7011.   !SetupScroll{3,ChunkyBitmap1,ScrollBitmap,6,_MBlockScroll,019}
  7012.  
  7013. _MBlockScrollCookieShort
  7014.   MOVE.w  CurrentChunkyShape1,d6
  7015. _MBlockScrollCookie
  7016. ;BlockScroll an area of the cookie from one place to another, possibly different source cookie
  7017.   !SetupScroll{3,ChunkyShape1,ScrollShape,6,_MBlockScroll,020}
  7018.  
  7019. _MBlockScrollBitmapToShapeShort
  7020.   MOVE.w  CurrentChunkyBitmap1,d6
  7021. _MBlockScrollBitmapToShape
  7022. ;BlockScroll an area of the bitmap from one place to an area in shape
  7023.   !SetupScroll{3,ChunkyShape1,ScrollBitmapToShape,5,_MBlockScroll,021}
  7024.  
  7025. _MBlockScrollShapeToBitmapShort
  7026.   MOVE.w  CurrentChunkyShape1,d6
  7027. _MBlockScrollShapeToBitmap
  7028. ;Scroll an area of the shape from one place to an area in a bitmap
  7029.   !SetupScroll{3,ChunkyBitmap1,ScrollShapeToBitmap,5,_MBlockScroll,022}
  7030.  
  7031. _MBlockScrollStencilToCookieShort
  7032.   MOVE.w  CurrentChunkyBitmap1,d6
  7033. _MBlockScrollStencilToCookie
  7034. ;BlockScroll an area of the stencil from one place to an area in cookie
  7035.   !SetupScroll{3,ChunkyShape1,ScrollBitmapToShape,6,_MBlockScroll,023}
  7036.  
  7037. _MBlockScrollCookieToStencilShort
  7038.   MOVE.w  CurrentChunkyShape1,d6
  7039. _MBlockScrollCookieToStencil
  7040. ;Scroll an area of the cookie from one place to an area in a stencil
  7041.   !SetupScroll{3,ChunkyBitmap1,ScrollShapeToBitmap,6,_MBlockScroll,024}
  7042.  
  7043. _MBlockScrollRoutine
  7044.   !ChooseScrollMethod{4,003}
  7045.  
  7046. ;*************************************************************************************
  7047.  
  7048. _MCPU
  7049. ;Set the general maximum CPU allowed to use. 0..3=000..030+,4=040+, 6=060. Do not to use a specific cpu if it is not available!
  7050.   MOVE.b  d0,SpecificCPUmode ; Store specifics of the cpu
  7051.   CMP.b   #4,d0 ; 040+?
  7052.   BLT     _MCPUlowCPU2
  7053.   MOVE.b  #-1,GeneralCPUmode ; Store general cpu level for 040 toggle on
  7054.   RTS
  7055. _MCPUlowCPU2
  7056.   MOVE.b  #0,GeneralCPUmode ; Store general cpu level for 040 toggle off
  7057.   RTS
  7058.  
  7059. ;*************************************************************************************
  7060.  
  7061. _MClsShort
  7062.   MOVEQ.l #0,d0
  7063. _MCls
  7064. ;Clearscreen a bitmap to 0 or specified colour
  7065.   MOVE.b  d0,d1 ; d1=Colour
  7066.   MOVE.w  CurrentChunkyBitmap1,d0 ; Bitmap to clear
  7067.   !GetBitmapObjectPtr ; Base in a0
  7068.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Base of data
  7069.   JSR     PerformCls
  7070.   RTS
  7071.  
  7072. ;*************************************************************************************
  7073.  
  7074. _MClsShapeShort
  7075.   MOVEQ.l #0,d0
  7076. _MClsShape
  7077. ;Clearscreen a shape to 0 or specified colour
  7078.   MOVE.b  d0,d1 ; d1=Colour
  7079.   MOVE.w  CurrentChunkyShape1,d0 ; Shape to clear
  7080.   !GetShapeObjectPtr ; Base in a0
  7081.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Base of data
  7082.   JSR     PerformCls
  7083.   RTS
  7084.  
  7085. ;*************************************************************************************
  7086.  
  7087. _MClsStencilShort
  7088.   MOVEQ.l #0,d0
  7089. _MClsStencil
  7090. ;Clearscreen a stencil to 0 or specified colour
  7091.   MOVE.b  d0,d1 ; d1=Colour
  7092.   MOVE.w  CurrentChunkyBitmap1,d0 ; Bitmap that has stencil to clear
  7093.   !GetBitmapObjectPtr ; Base in a0
  7094.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a1 ; Base of stencil
  7095.   TST.b   d1
  7096.   SEQ     d1 ; Make stencil byte value
  7097.   MOVE.w  _DrawingModeType,d7
  7098.   CMP.w   #4,d7
  7099.   BLE     _MClsStencilSkip
  7100.   MOVE.w  d7,-(a7) ; Store
  7101.   MOVE.w  #4,_DrawingModeType ; Force MColourMode instead of remapping
  7102.   JSR     PerformCls
  7103.   MOVE.w  (a7)+,_DrawingModeType ; Restore
  7104.   RTS
  7105. _MClsStencilSkip
  7106.   JSR     PerformCls
  7107.   RTS
  7108.  
  7109. ;*************************************************************************************
  7110.  
  7111. _MClsCookieShort
  7112.   MOVEQ.l #0,d0
  7113. _MClsCookie
  7114. ;Clearscreen a cookie to 0 or specified colour
  7115.   MOVE.b  d0,d1 ; d1=Colour
  7116.   MOVE.w  CurrentChunkyShape1,d0 ; Shape that has cookie to clear
  7117.   !GetShapeObjectPtr ; Base in a0
  7118.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a1 ; Base of cookie
  7119.   TST.b   d1
  7120.   SEQ     d1 ; Make cookie byte value
  7121.   MOVE.w  _DrawingModeType,d7
  7122.   CMP.w   #4,d7
  7123.   BLE     _MClsCookieSkip
  7124.   MOVE.w  d7,-(a7) ; Store
  7125.   MOVE.w  #4,_DrawingModeType ; Force MColourMode instead of remapping
  7126.   JSR     PerformCls
  7127.   MOVE.w  (a7)+,_DrawingModeType ; Restore
  7128.   RTS
  7129. _MClsCookieSkip
  7130.   JSR     PerformCls
  7131.   RTS
  7132.  
  7133. ;*************************************************************************************
  7134.  
  7135. _MPlotShort
  7136.   MOVEQ.l #0,d2 ; Init
  7137.   MOVE.b  CurrentInk1,d2 ; Colour to use
  7138. _MPlot
  7139. ;Plot a coloured pixel in a bitmap
  7140.   MOVE.w  d0,d6 ; Store Xpos
  7141.   MOVE.w  CurrentChunkyBitmap1,d0 ; Bitmap to plot in
  7142.   !GetBitmapObjectPtr ; Base in a0
  7143.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Data mem
  7144.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  7145.   BEQ     _MPlotSkip
  7146.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1
  7147. _MPlotSkip
  7148.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d7
  7149.   MULU    d1,d7
  7150.   ADD.w   d6,a1 ; x
  7151.   MOVE.w  _DrawingModeType,d5 ; Get mode
  7152.   ADD.l   d7,a1 ; y
  7153.   CMP.b   #4,d5 ; What mode?
  7154.   BLT     _MPlotInv
  7155.   BGT     _MPlotNextMode
  7156. _MPlotColour
  7157.   MOVE.b  d2,(a1) ; Plot MColourMode
  7158.   RTS
  7159. _MPlotInv
  7160.   NOT.b   (a1) ; Plot InvMode
  7161.   RTS
  7162. _MPlotNextMode
  7163.   CMP.b   #6,d5 ; What mode?
  7164.   BLT     _MPlotReMap
  7165.   BGT     _MPlotAdd
  7166. _MPlotSimpleReMap
  7167.   MOVE.w  CurrentChunkyTable1,d0
  7168.   !GetTableObjectPtr ; Base in a0
  7169.   MOVEQ.l #0,d0 ; init
  7170.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0 ; Base of table
  7171.   MOVE.b  (a1),d0 ; Get point
  7172.   MOVE.b  0(a0,d0.w),(a1) ; Plot SimpleReMap
  7173.   RTS
  7174. _MPlotReMap
  7175.   LSL.w   #8,d2
  7176.   MOVE.w  CurrentChunkyTable1,d0
  7177.   AND.l   #$0000FF00,d2
  7178.   !GetTableObjectPtr ; Base in a0
  7179.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0 ; Base of table
  7180.   MOVE.b  (a1),d2 ; Get point
  7181.   MOVE.b  0(a0,d2.l),(a1) ; Plot ReMap
  7182.   RTS
  7183. _MPlotAdd
  7184.   ADD.b   d2,(a1) ; Plot Add
  7185.   RTS
  7186.  
  7187. ;*************************************************************************************
  7188.  
  7189. _MPlotShapeShort
  7190.   MOVEQ.l #0,d2 ; Init
  7191.   MOVE.b  CurrentInk1,d2 ; Colour to use
  7192. _MPlotShape
  7193. ;Plot a coloured pixel in a shape
  7194.   MOVE.w  d0,d6 ; Store Xpos
  7195.   MOVE.w  CurrentChunkyShape1,d0 ; Shape to plot in
  7196.   !GetShapeObjectPtr ; Base in a0
  7197.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Data mem
  7198.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  7199.   BEQ     _MPlotShapeSkip
  7200.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1
  7201. _MPlotShapeSkip
  7202.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d7
  7203.   MULU    d1,d7
  7204.   ADD.w   d6,a1 ; x
  7205.   MOVE.w  _DrawingModeType,d5 ; Get mode
  7206.   ADD.l   d7,a1 ; y
  7207.   CMP.b   #4,d5 ; What mode?
  7208.   BLT     _MPlotShapeInv
  7209.   BGT     _MPlotShapeNextMode
  7210. _MPlotShapeColour
  7211.   MOVE.b  d2,(a1) ; Plot MColourMode
  7212.   RTS
  7213. _MPlotShapeInv
  7214.   NOT.b   (a1) ; Plot InvMode
  7215.   RTS
  7216. _MPlotShapeNextMode
  7217.   CMP.b   #6,d5 ; What mode?
  7218.   BLT     _MPlotShapeReMap
  7219.   BGT     _MPlotShapeAdd
  7220. _MPlotShapeSimpleReMap
  7221.   MOVE.w  CurrentChunkyTable1,d0
  7222.   !GetTableObjectPtr ; Base in a0
  7223.   MOVEQ.l #0,d0 ; init
  7224.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0 ; Base of table
  7225.   MOVE.b  (a1),d0 ; Get point
  7226.   MOVE.b  0(a0,d0.w),(a1) ; Plot SimpleReMap
  7227.   RTS
  7228. _MPlotShapeReMap
  7229.   LSL.w   #8,d2
  7230.   MOVE.w  CurrentChunkyTable1,d0
  7231.   AND.l   #$0000FF00,d2
  7232.   !GetTableObjectPtr ; Base in a0
  7233.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0 ; Base of table
  7234.   MOVE.b  (a1),d2 ; Get point
  7235.   MOVE.b  0(a0,d2.l),(a1) ; Plot ReMap
  7236.   RTS
  7237. _MPlotShapeAdd
  7238.   ADD.b   d2,(a1) ; Plot Add
  7239.   RTS
  7240.  
  7241. ;*************************************************************************************
  7242.  
  7243. _MPlotStencilShort
  7244.   MOVEQ.l #0,d2 ; Init
  7245.   MOVE.b  CurrentInk1,d2 ; Colour to use
  7246. _MPlotStencil
  7247. ;Plot a stencil-pixel ($00/$FF) in a stencil
  7248.   MOVE.w  d0,d6 ; Copy Xpos
  7249.   MOVE.w  CurrentChunkyBitmap1,d0 ; Bitmap that has stencil to plot in
  7250.   !GetBitmapObjectPtr ; Base in a0
  7251.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a1 ; Stencil mem
  7252.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  7253.   BEQ     _MPlotStencilSkip
  7254.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1
  7255. _MPlotStencilSkip
  7256.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d7
  7257.   MULU    d1,d7
  7258.   ADD.w   d6,a1 ; x
  7259.   MOVE.w  _DrawingModeType,d5 ; Get mode
  7260.   ADD.l   d7,a1 ; y
  7261.   CMP.b   #4,d5 ; What mode?
  7262.   BLT     _MPlotStencilInv
  7263.   ;BGT     _MPlotStencilNextCheck
  7264. _MPlotStencilColour
  7265.   TST.b   d2
  7266.   SEQ.b   d2 ; Prepare stencil byte
  7267.   MOVE.b  d2,(a1) ; Plot MColourMode
  7268.   RTS
  7269. _MPlotStencilInv
  7270.   NOT.b   (a1) ; Plot InvMode
  7271.   RTS
  7272. _MPlotStencilNextCheck
  7273.   ; More here, MSimpleReMap, MReMap and MAdd ignored
  7274.   RTS
  7275.  
  7276. ;*************************************************************************************
  7277.  
  7278. _MPlotCookieShort
  7279.   MOVEQ.l #0,d2 ; Init
  7280.   MOVE.b  CurrentInk1,d2 ; Colour to use
  7281. _MPlotCookie
  7282. ;Plot a cookie-pixel ($00/$FF) in a cookie
  7283.   MOVE.l  d0,d6 ; Copy Xpos
  7284.   MOVE.w  CurrentChunkyShape1,d0 ; Shape that has cookie to plot in
  7285.   !GetShapeObjectPtr ; Base in a0
  7286.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a1 ; Cookie mem
  7287.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  7288.   BEQ     _MPlotCookieSkip
  7289.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1
  7290. _MPlotCookieSkip
  7291.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d7
  7292.   MULU    d1,d7
  7293.   ADD.w   d6,a1 ; x
  7294.   MOVE.w  _DrawingModeType,d5 ; Get mode
  7295.   ADD.l   d7,a1 ; y
  7296.   CMP.b   #4,d5 ; What mode?
  7297.   BLT     _MPlotCookieInv
  7298.   ;BGT     _MPlotCookieNextMode
  7299. _MPlotCookieColour
  7300.   TST.b   d2
  7301.   SEQ.b   d2 ; Prepare stencil byte
  7302.   MOVE.b  d2,(a1) ; Plot MColourMode
  7303.   RTS
  7304. _MPlotCookieInv
  7305.   NOT.b   (a1) ; Plot InvMode
  7306.   RTS
  7307. _MPlotCookieNextMode
  7308.   ; More modes here. MReMap, MSimpleReMap and MAdd ignored
  7309.   RTS
  7310.  
  7311. ;*************************************************************************************
  7312.  
  7313. _MPointShort
  7314.   MOVE.w  CurrentChunkyBitmap1,d2 ; Bitmap to read from
  7315. _MPoint
  7316. ;Return the colour of a pixel in a bitmap
  7317.   EXG.l   d0,d2 ; Store Xpos
  7318.   !GetBitmapObjectPtr ; Base in a0
  7319.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Data mem
  7320.   !PerformPoint{001}
  7321.   RTS
  7322.  
  7323. ;*************************************************************************************
  7324.  
  7325. _MPointShapeShort
  7326.   MOVE.w  CurrentChunkyShape1,d2 ; Shape to read from
  7327. _MPointShape
  7328. ;Return the colour of a pixel in a shape
  7329.   EXG.l   d0,d2 ; Store Xpos
  7330.   !GetShapeObjectPtr ; Base in a0
  7331.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Data mem
  7332.   !PerformPoint{002}
  7333.   RTS
  7334.  
  7335. ;*************************************************************************************
  7336.  
  7337. _MPointStencilShort
  7338.   MOVE.w  CurrentChunkyBitmap1,d2 ; Bitmap that has stencil to read from
  7339. _MPointStencil
  7340. ;Return status of a pixel in a stencil. $FF (-1) = Data, $00 = Background
  7341.   EXG.l   d0,d2 ; Copy Xpos
  7342.   !GetBitmapObjectPtr ; Base in a0
  7343.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a1 ; Stencil mem
  7344.   !PerformPoint{003}
  7345.   TST.b   d0
  7346.   SEQ     d0 ; Prepare stencil byte
  7347.   RTS
  7348.  
  7349. ;*************************************************************************************
  7350.  
  7351. _MPointCookieShort
  7352.   MOVE.w  CurrentChunkyShape1,d2 ; Shape that has cookie to read from
  7353. _MPointCookie
  7354. ;Return status of a pixel in a cookie. $FF (-1) = Data, $00 = Background
  7355.   EXG.l   d0,d2 ; Copy Xpos
  7356.   !GetShapeObjectPtr ; Base in a0
  7357.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a1 ; Cookie mem
  7358.   !PerformPoint{004}
  7359.   TST.b   d0
  7360.   SEQ     d0 ; Prepare cookie byte
  7361.   RTS
  7362.  
  7363. ;*************************************************************************************
  7364.  
  7365. _MDoubleScrollShort
  7366.   MOVE.w  CurrentChunkyBitmap1,d6
  7367. _MSScroll
  7368. _MDoubleScroll
  7369. ;Scroll an area of the bitmap from one place to an area in another and COPY (overwrite) the stencil from the stencil
  7370.   !SetupScroll{4,ChunkyBitmap1,ScrollBitmap,3,_MDoubleScroll,025}
  7371. _MDoubleScrollCustom
  7372.   !SetupScroll2{4,ChunkyBitmap1,ScrollBitmap,3,_MDoubleScroll,025}
  7373.  
  7374. _MDoubleScrollShapeShort
  7375.   MOVE.w  CurrentChunkyShape1,d6
  7376. _MSScrollShape
  7377. _MDoubleScrollShape
  7378. ;Scroll an area of the Shape from one place to an area in another and COPY (overwrite) the cookie from the cookie
  7379.   !SetupScroll{4,ChunkyShape1,ScrollShape,3,_MDoubleScroll,026}
  7380. _MDoubleScrollShapeCustom
  7381.   !SetupScroll2{4,ChunkyShape1,ScrollShape,3,_MDoubleScroll,026}
  7382.  
  7383. _MDoubleScrollBitmapToShapeShort
  7384.   MOVE.w  CurrentChunkyBitmap1,d6
  7385. _MSScrollBitmapToShape
  7386. _MDoubleScrollBitmapToShape
  7387. ;Scroll an area of the bitmap from one place to an area in a shape and COPY (overwrite) the stencil to the cookie
  7388.   !SetupScroll{4,ChunkyShape1,ScrollBitmapToShape,3,_MDoubleScroll,027}
  7389. _MDoubleScrollBitmapToShapeCustom
  7390.   !SetupScroll2{4,ChunkyShape1,ScrollBitmapToShape,3,_MDoubleScroll,027}
  7391.  
  7392. _MDoubleScrollShapeToBitmapShort
  7393.   MOVE.w  CurrentChunkyShape1,d6
  7394. _MSScrollShapeToBitmap
  7395. _MDoubleScrollShapeToBitmap
  7396. ;Scroll an area of the Shape from one place to an area in a bitmap and COPY (overwrite) the cookie to the stencil
  7397.   !SetupScroll{4,ChunkyBitmap1,ScrollShapeToBitmap,3,_MDoubleScroll,028}
  7398. _MDoubleScrollShapeToBitmapCustom
  7399.   !SetupScroll2{4,ChunkyBitmap1,ScrollShapeToBitmap,3,_MDoubleScroll,028}
  7400.  
  7401. _MDoubleScrollRoutine
  7402.   !ChooseDoubleScrollMethod{5,8,001}
  7403. _MDoubleScrollRoutine2
  7404.   !ChooseDoubleScrollMethod2{5,8,001}
  7405.  
  7406. ;*************************************************************************************
  7407.  
  7408. _MDoubleStencilScrollShort
  7409.   MOVE.w  CurrentChunkyBitmap1,d6
  7410. _MSMaskScroll
  7411. _MDoubleStencilScroll
  7412. ;Stencil-Scroll an area of the bitmap from one place to an area in another and stencil-copy the stencil from the stencil
  7413.   !SetupScroll{1,ChunkyBitmap1,ScrollBitmap,3,_MDoubleStenScroll,029}
  7414.  
  7415. _MDoubleCookieScrollShort
  7416.   MOVE.w  CurrentChunkyShape1,d6
  7417. _MSMaskScrollShape
  7418. _MDoubleCookieScroll
  7419. ;Cookie-Scroll an area of the Shape from one place to an area in another and cookie-copy the cookie from the cookie
  7420.   !SetupScroll{1,ChunkyShape1,ScrollShape,3,_MDoubleStenScroll,030}
  7421.  
  7422. _MDoubleStencilScrollBitmapToShapeShort
  7423.   MOVE.w  CurrentChunkyBitmap1,d6
  7424. _MSMaskScrollBitmapToShape
  7425. _MDoubleStencilScrollBitmapToShape
  7426. ;Stencil-Scroll an area of the bitmap from one place to an area in a shape and stencil-copy the stencil to the cookie
  7427.   !SetupScroll{1,ChunkyShape1,ScrollBitmapToShape,3,_MDoubleStenScroll,031}
  7428.  
  7429. _MDoubleCookieScrollShapeToBitmapShort
  7430.   MOVE.w  CurrentChunkyShape1,d6
  7431. _MSMaskScrollShapeToBitmap
  7432. _MDoubleCookieScrollShapeToBitmap
  7433. ;Cookie-Scroll an area of the Shape from one place to an area in a bitmap and cookie-copy the cookie to the stencil
  7434.   !SetupScroll{1,ChunkyBitmap1,ScrollShapeToBitmap,3,_MDoubleStenScroll,032}
  7435.  
  7436. _MDoubleStenScrollRoutine
  7437.   !ChooseDoubleScrollMethod{6,9,002}
  7438.  
  7439. ;*************************************************************************************
  7440.  
  7441. _MDoubleBlockScrollShort
  7442.   MOVE.w  CurrentChunkyBitmap1,d6
  7443. _MSBlockScroll
  7444. _MDoubleBlockScroll
  7445. ;BlockScroll an area of the bitmap from one place to an area in another and COPY (overwrite) the stencil from the stencil
  7446.   !SetupScroll{3,ChunkyBitmap1,ScrollBitmap,3,_MDoubleBlockScroll,033}
  7447.  
  7448. _MDoubleBlockScrollShapeShort
  7449.   MOVE.w  CurrentChunkyShape1,d6
  7450. _MSBlockScrollShape
  7451. _MDoubleBlockScrollShape
  7452. ;BlockScroll an area of the Shape from one place to an area in another and COPY (overwrite) the cookie from the cookie
  7453.   !SetupScroll{3,ChunkyShape1,ScrollShape,3,_MDoubleBlockScroll,034}
  7454.  
  7455. _MDoubleBlockScrollBitmapToShapeShort
  7456.   MOVE.w  CurrentChunkyBitmap1,d6
  7457. _MSBlockScrollBitmapToShape
  7458. _MDoubleBlockScrollBitmapToShape
  7459. ;BlockScroll an area of the bitmap from one place to an area in a shape and COPY (overwrite) the stencil to the cookie
  7460.   !SetupScroll{3,ChunkyShape1,ScrollBitmapToShape,3,_MDoubleBlockScroll,035}
  7461.  
  7462. _MDoubleBlockScrollShapeToBitmapShort
  7463.   MOVE.w  CurrentChunkyShape1,d6
  7464. _MSBlockScrollShapeToBitmap
  7465. _MDoubleBlockScrollShapeToBitmap
  7466. ;BlockScroll an area of the Shape from one place to an area in a bitmap and COPY (overwrite) the cookie to the stencil
  7467.   !SetupScroll{3,ChunkyBitmap1,ScrollShapeToBitmap,3,_MDoubleBlockScroll,036}
  7468.  
  7469. _MDoubleBlockScrollRoutine
  7470.   !ChooseDoubleScrollMethod{7,10,003}
  7471.  
  7472. ;*************************************************************************************
  7473. _MSScrollCut
  7474. _MDoubleScrollCut
  7475. ;Set the type of blit to be used in the Double Scroll commands
  7476.   MOVE.b  d0,DoubleScrollMode ; Set status
  7477.   RTS
  7478.  
  7479. ;*************************************************************************************
  7480. _MUseShapeBank
  7481. _MUseChunkyShapeBank
  7482. ;Set the current bank of ChunkyShapes to use
  7483.   MOVE.w  d0,CurrentChunkyShapeBank ; Store
  7484.   EXT.l   d0
  7485.   LSL.l   #3,d0 ; *8 for offset
  7486.   LEA     ChunkyShapeBanks,a0
  7487.   ADD.l   d0,a0
  7488.   MOVE.l  (a0)+,ChunkyShapesMem ; Copy bank's mem to current
  7489.   MOVE.w  (a0),ChunkyShapesTotal ; Copy bank's total to current
  7490.   RTS
  7491.  
  7492. ;*************************************************************************************
  7493.  
  7494. _MPictureDissolveIn
  7495. ;Bring in the second-used bitmap into the first-used bitmap using bitmap design d0, currently colour d1
  7496.   MOVE.b  d1,d2 ; Store colour
  7497.   !GetBitmapObjectPtr ; Base in a0
  7498.   MOVE.l  a0,a2 ; Picture bitmap
  7499.   MOVE.w  CurrentChunkyBitmap2,d0 ; Dest bitmap
  7500.   !GetBitmapObjectPtr ; Base in a0
  7501.   MOVE.l  a0,a1 ; Dest
  7502.   MOVE.w  CurrentChunkyBitmap1,d0 ; Source bitmap
  7503.   !GetBitmapObjectPtr ; Base in a0 - source
  7504.   MOVEM.l a3-a5,-(a7) ; Store
  7505.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a3 ; Source data
  7506.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a4 ; Dest data
  7507.   MOVE.l  CRsrc_Data-ChunkyResources(a2),a5 ; Picture design data
  7508.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Source wraps?
  7509.   BEQ     _MPictureDINoWrap1
  7510.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a3
  7511. _MPictureDINoWrap1
  7512.   TST.b   CRsrc_Wrapping-ChunkyResources(a1) ; Dest wraps?
  7513.   BEQ     _MPictureDINoWrap2
  7514.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a4
  7515. _MPictureDINoWrap2
  7516.   TST.b   CRsrc_Wrapping-ChunkyResources(a2) ; Picture wraps?
  7517.   BEQ     _MPictureDINoWrap3
  7518.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a2),a5
  7519. _MPictureDINoWrap3
  7520.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d5 ; Source linemod
  7521.   MOVE.w  CRsrc_LineMod-ChunkyResources(a1),d6 ; Dest linemod
  7522.   MOVE.w  CRsrc_LineMod-ChunkyResources(a2),d7 ; Picture linemod
  7523.   TST.b   CRsrc_Clipping-ChunkyResources(a1) ; Clip?
  7524.   BEQ     _MPictureDINoClip
  7525.   ADD.l   CRsrc_ClipBytes-ChunkyResources(a0),a3
  7526.   ADD.w   CRsrc_ClipLMod-ChunkyResources(a0),d5
  7527.   ADD.l   CRsrc_ClipBytes-ChunkyResources(a1),a4
  7528.   ADD.w   CRsrc_ClipLMod-ChunkyResources(a1),d6
  7529.   ADD.l   CRsrc_ClipBytes-ChunkyResources(a2),a5
  7530.   ADD.w   CRsrc_ClipLMod-ChunkyResources(a2),d7
  7531.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a1),d0 ; Width
  7532.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a1),d1 ; Height
  7533.   BRA     _MPictureDissolveInSkip2
  7534. _MPictureDINoClip
  7535.   MOVE.w  CRsrc_Width-ChunkyResources(a1),d0 ; Width
  7536.   MOVE.w  CRsrc_Height-ChunkyResources(a1),d1 ; Height
  7537. _MPictureDissolveInSkip2
  7538.   LSR.w   #2,d0 ; Width/4 for longwords
  7539.   SUBQ.w  #1,d0 ; XLoopcounter
  7540.   MOVE.w  d0,d3 ; Copy XLoop
  7541.   SUBQ.w  #1,d1 ; YLoopcounter
  7542.   MOVEQ.l #4,d4 ; Temp skip value
  7543. _MPictureDIYLoop
  7544.     MOVE.w  d3,d0 ; Copy XLoop
  7545. _MPictureDIXLoop
  7546.       CMP.b   (a5)+,d2
  7547.       BNE     _MPictureDIJump1
  7548.       MOVE.b  (a3),(a4)
  7549. _MPictureDIJump1
  7550.       CMP.b   (a5)+,d2
  7551.       BNE     _MPictureDIJump2
  7552.       MOVE.b  1(a3),1(a4)
  7553. _MPictureDIJump2
  7554.       CMP.b   (a5)+,d2
  7555.       BNE     _MPictureDIJump3
  7556.       MOVE.b  2(a3),2(a4)
  7557. _MPictureDIJump3
  7558.       CMP.b   (a5)+,d2
  7559.       BNE     _MPictureDIJump4
  7560.       MOVE.b  3(a3),3(a4)
  7561. _MPictureDIJump4
  7562.       ADD.w   d4,a3
  7563.       ADD.w   d4,a4
  7564.       DBRA    d0,_MPictureDIXLoop
  7565.     ADD.w   d5,a3 ; Source linemod
  7566.     ADD.w   d6,a4 ; Dest linemod
  7567.     ADD.w   d7,a5 ; Picture linemod
  7568.     DBRA    d1,_MPictureDIYLoop
  7569.   MOVEM.l (a7)+,a3-a5 ; Restore
  7570. _MPictureDissolveInSkip
  7571.   RTS
  7572.  
  7573. ;*************************************************************************************
  7574.  
  7575. _MSScrollModeShort
  7576.   MOVE.w  SScrollModeType,d0
  7577.   EXT.l   d0 ; Return current mode in d0
  7578.   RTS
  7579. _MMaskScrollMode
  7580. _MSScrollMode
  7581. ;Set blit mode type for StencilScroll and CcookieScroll
  7582.   CMP.w   #8,d0 ; Direct?
  7583.   BGE     _MSScrollModeJump
  7584.   MOVE.w  d0,SScrollModeType ; Directly copy type number
  7585.   RTS
  7586. _MSScrollModeJump
  7587.   CMP.w   #_CookieMode,d0 ; CookieMode?
  7588.   BNE     _MSScrollModeSkip
  7589.   MOVE.w  #0,SScrollModeType ; Store type for CookieMode
  7590.   RTS
  7591. _MSScrollModeSkip
  7592.   CMP.w   #_EraseMode,d0 ; EraseMode?
  7593.   BNE     _MSScrollModeSkip2
  7594.   MOVE.w  #1,SScrollModeType ; Store type for EraseMode
  7595.   RTS
  7596. _MSScrollModeSkip2
  7597.   CMP.w   #_InvMode,d0 ; InvMode?
  7598.   BNE     _MSScrollModeSkip3
  7599.   MOVE.w  #2,SScrollModeType ; Store type for InvMode
  7600.   RTS
  7601. _MSScrollModeSkip3
  7602.   CMP.w   #_SolidMode,d0 ; SolidMode?
  7603.   BNE     _MSScrollModeSkip4
  7604.   MOVE.w  #3,SScrollModeType ; Store type for SolidMode
  7605.   RTS
  7606. _MSScrollModeSkip4
  7607.   RTS
  7608.  
  7609. ;*************************************************************************************
  7610.  
  7611. _MBlitModeShort
  7612.   MOVE.w  _BlitModeType,d0
  7613.   EXT.l   d0 ; Return current mode in d0
  7614.   RTS
  7615. _MBlitMode
  7616. ;Set blit mode type for `MBlit'
  7617.   CMP.w   #8,d0 ; Direct?
  7618.   BGE     _MBlitModeJump
  7619.   MOVE.w  d0,_BlitModeType ; Directly copy type number
  7620.   RTS
  7621. _MBlitModeJump
  7622.   CMP.w   #_CookieMode,d0 ; CookieMode?
  7623.   BNE     _MBlitModeSkip
  7624.   MOVE.w  #0,_BlitModeType ; Store type for CookieMode
  7625.   RTS
  7626. _MBlitModeSkip
  7627.   CMP.w   #_EraseMode,d0 ; EraseMode?
  7628.   BNE     _MBlitModeSkip2
  7629.   MOVE.w  #1,_BlitModeType ; Store type for EraseMode
  7630.   RTS
  7631. _MBlitModeSkip2
  7632.   CMP.w   #_InvMode,d0 ; InvMode?
  7633.   BNE     _MBlitModeSkip3
  7634.   MOVE.w  #2,_BlitModeType ; Store type for InvMode
  7635.   RTS
  7636. _MBlitModeSkip3
  7637.   CMP.w   #_SolidMode,d0 ; SolidMode?
  7638.   BNE     _MBlitModeSkip4
  7639.   MOVE.w  #3,_BlitModeType ; Store type for SolidMode
  7640.   RTS
  7641. _MBlitModeSkip4
  7642.   RTS
  7643.  
  7644. ;*************************************************************************************
  7645.  
  7646. _MBlitShort
  7647.   MOVE.w  d1,d2
  7648.   MOVE.w  d0,d1
  7649.   MOVE.w  CurrentChunkyShape1,d0
  7650. _MBlit
  7651. ;Scroll a whole Shape to a Bitmap
  7652.   MOVE.w  d0,d7 ; Store
  7653.   MOVE.w  CurrentChunkyBitmap1,d0 ; Dest resource
  7654.   !GetBitmapObjectPtr ; base in a0
  7655.   MOVE.l  a0,a1 ; Dest bitmap
  7656.   MOVE.w  d7,d0
  7657.   !GetShapeObjectPtr ; base in a0 - Source shape
  7658.   MOVEM.l a3/a4,-(a7) ; Store
  7659.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a2 ; source data
  7660.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a4 ; source stencil
  7661.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a3 ; dest data
  7662.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d6 ; source modulo
  7663.   MOVE.w  CRsrc_LineMod-ChunkyResources(a1),d7 ; dest modulo
  7664.   TST.b   CRsrc_Wrapping-ChunkyResources(a1) ; Dest wrap?
  7665.   BEQ     _MBlitNoWrap
  7666.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a3
  7667. _MBlitNoWrap
  7668.   SUB.w   CRsrc_XHandle-ChunkyResources(a0),d1 ; Adjust Xpos
  7669.   SUB.w   CRsrc_YHandle-ChunkyResources(a0),d2 ; Adjust Ypos
  7670.   MOVE.w  d7,d0 ; Temp
  7671.   MOVE.w  CRsrc_Width-ChunkyResources(a1),d5
  7672.   ADD.w   d5,d0
  7673.   MULU    d0,d2
  7674.   ADD.w   d1,a3 ; Dest coordinate offset
  7675.   ADD.l   d2,a3 ; X2,Y2 in dest data
  7676.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d3 ; OpWidth
  7677.   SUB.w   d3,d5 ; extra linemod
  7678.   ADD.w   d5,d7 ; dest
  7679.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d4 ; OpHeight
  7680.   MOVE.w  _BlitModeType,d0
  7681.   BSR     PerformBlit1 ; Blit forwards
  7682.   MOVEM.l (a7)+,a3/a4 ; Restore
  7683.   RTS
  7684.  
  7685. ;*************************************************************************************
  7686.  
  7687. _MBlockShort
  7688.   MOVE.w  d1,d2
  7689.   MOVE.w  d0,d1
  7690.   MOVE.w  CurrentChunkyShape1,d0
  7691. _MBlock
  7692. ;Block-Scroll a whole Shape to a Bitmap
  7693.   MOVE.w  d0,d7 ; Store
  7694.   MOVE.w  CurrentChunkyBitmap1,d0 ; Dest resource
  7695.   !GetBitmapObjectPtr ; base in a0
  7696.   MOVE.l  a0,a1 ; Dest bitmap
  7697.   MOVE.w  d7,d0
  7698.   !GetShapeObjectPtr ; base in a0 - Source shape
  7699.   MOVE.l  a3,-(a7) ; Store
  7700.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a2 ; source data
  7701.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a3 ; dest data
  7702.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d6 ; source modulo
  7703.   MOVE.w  CRsrc_LineMod-ChunkyResources(a1),d7 ; dest modulo
  7704.   TST.b   CRsrc_Wrapping-ChunkyResources(a1) ; Dest wrap?
  7705.   BEQ     _MBlockNoWrap
  7706.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a3
  7707. _MBlockNoWrap
  7708.   SUB.w   CRsrc_XHandle-ChunkyResources(a0),d1 ; Adjust Xpos
  7709.   SUB.w   CRsrc_YHandle-ChunkyResources(a0),d2 ; Adjust Ypos
  7710.   AND.b   #$F0,d1 ; Align X
  7711.   MOVE.w  d7,d0 ; Temp
  7712.   MOVE.w  CRsrc_Width-ChunkyResources(a1),d5
  7713.   ADD.w   d5,d0
  7714.   MULU    d0,d2
  7715.   ADD.w   d1,a3 ; Dest coordinate offset
  7716.   ADD.l   d2,a3 ; X2,Y2 in dest data
  7717.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d3 ; OpWidth
  7718.   SUB.w   d3,d5 ; extra linemod
  7719.   ADD.w   d5,d7 ; dest
  7720.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d4 ; OpHeight
  7721.   BSR     PerformGenericBlit4 ; Block-Blit forwards
  7722.   MOVE.l  (a7)+,a3 ; Restore
  7723.   RTS
  7724.  
  7725. ;*************************************************************************************
  7726.  
  7727. _MTile16x16Short
  7728.   MOVE.w  d1,d2
  7729.   MOVE.w  d0,d1
  7730.   MOVE.w  CurrentChunkyShape1,d0
  7731. _MTile16x16
  7732.   AND.b   #$F0,d1 ; Align X
  7733.   AND.b   #$F0,d2 ; Align Y
  7734.   MOVE.w  d0,d7 ; Store
  7735.   MOVE.w  CurrentChunkyBitmap1,d0 ; Dest resource
  7736.   !GetBitmapObjectPtr ; base in a0
  7737.   MOVE.l  a0,a1 ; Dest bitmap
  7738.   MOVE.w  d7,d0
  7739.   !GetShapeObjectPtr ; base in a0 - Source shape
  7740.   MOVE.l  a3,-(a7) ; Store
  7741.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a2 ; source data
  7742.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a3 ; dest data
  7743.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d6 ; source modulo
  7744.   MOVE.w  CRsrc_LineMod-ChunkyResources(a1),d7 ; dest modulo
  7745.   TST.b   CRsrc_Wrapping-ChunkyResources(a1) ; Dest wrap?
  7746.   BEQ     _MTile16x16NoWrap
  7747.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a3
  7748. _MTile16x16NoWrap
  7749.   MOVE.w  d7,d0 ; Temp
  7750.   MOVE.w  CRsrc_Width-ChunkyResources(a1),d5
  7751.   ADD.w   d5,d0
  7752.   MULU    d0,d2
  7753.   ADD.w   d1,a3 ; Dest coordinate offset
  7754.   ADD.l   d2,a3 ; X2,Y2 in dest data
  7755.   SUB.w   #16,d5 ; extra linemod
  7756.   ADD.w   d5,d7 ; dest
  7757.   MOVEQ.l #16-1,d4 ; OpHeight-1 for y loop on 030
  7758.   JSR     PerformTile16x16 ; Block-Blit forwards
  7759.   MOVE.l  (a7)+,a3 ; Restore
  7760.   RTS
  7761.  
  7762. ;*************************************************************************************
  7763.  
  7764. _MTile32x32Short
  7765.   MOVE.w  d1,d2
  7766.   MOVE.w  d0,d1
  7767.   MOVE.w  CurrentChunkyShape1,d0
  7768. _MTile32x32
  7769.   AND.b   #$E0,d1 ; Align X
  7770.   AND.b   #$E0,d2 ; Align Y
  7771.   MOVE.w  d0,d7 ; Store
  7772.   MOVE.w  CurrentChunkyBitmap1,d0 ; Dest resource
  7773.   !GetBitmapObjectPtr ; base in a0
  7774.   MOVE.l  a0,a1 ; Dest bitmap
  7775.   MOVE.w  d7,d0
  7776.   !GetShapeObjectPtr ; base in a0 - Source shape
  7777.   MOVE.l  a3,-(a7) ; Store
  7778.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a2 ; source data
  7779.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a3 ; dest data
  7780.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d6 ; source modulo
  7781.   MOVE.w  CRsrc_LineMod-ChunkyResources(a1),d7 ; dest modulo
  7782.   TST.b   CRsrc_Wrapping-ChunkyResources(a1) ; Dest wrap?
  7783.   BEQ     _MTile32x32NoWrap
  7784.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a3
  7785. _MTile32x32NoWrap
  7786.   MOVE.w  d7,d0 ; Temp
  7787.   MOVE.w  CRsrc_Width-ChunkyResources(a1),d5
  7788.   ADD.w   d5,d0
  7789.   MULU    d0,d2
  7790.   ADD.w   d1,a3 ; Dest coordinate offset
  7791.   ADD.l   d2,a3 ; X2,Y2 in dest data
  7792.   SUB.w   #32,d5 ; extra linemod
  7793.   ADD.w   d5,d7 ; dest
  7794.   MOVEQ.l #32-1,d4 ; OpHeight for y loop on 030
  7795.   JSR     PerformTile32x32 ; Block-Blit forwards
  7796.   MOVE.l  (a7)+,a3 ; Restore
  7797.   RTS
  7798.  
  7799. ;*************************************************************************************
  7800.  
  7801. _MDoubleTile16x16Short
  7802.   MOVE.w  d1,d2
  7803.   MOVE.w  d0,d1
  7804.   MOVE.w  CurrentChunkyShape1,d0
  7805. _MSTile16x16
  7806. _MDoubleTile16x16
  7807.   AND.b   #$F0,d1 ; Align X
  7808.   AND.b   #$F0,d2 ; Align Y
  7809.   MOVE.w  d0,d7 ; Store
  7810.   MOVE.w  CurrentChunkyBitmap1,d0 ; Dest resource
  7811.   !GetBitmapObjectPtr ; base in a0
  7812.   MOVE.l  a0,a1 ; Dest bitmap
  7813.   MOVE.w  d7,d0
  7814.   !GetShapeObjectPtr ; base in a0 - Source shape
  7815.   MOVEM.l a3-a5,-(a7) ; Store
  7816.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a2 ; source data
  7817.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a4 ; source cookie
  7818.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a3 ; dest data
  7819.   MOVE.l  CRsrc_Stencil-ChunkyResources(a1),a5 ; dest stencil
  7820.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d6 ; source modulo
  7821.   MOVE.w  CRsrc_LineMod-ChunkyResources(a1),d7 ; dest modulo
  7822.   TST.b   CRsrc_Wrapping-ChunkyResources(a1) ; Dest wrap?
  7823.   BEQ     _MDoubleTile16x16NoWrap
  7824.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a3
  7825.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a5
  7826. _MDoubleTile16x16NoWrap
  7827.   MOVE.w  d7,d0 ; Temp
  7828.   MOVE.w  CRsrc_Width-ChunkyResources(a1),d5
  7829.   ADD.w   d5,d0
  7830.   MULU    d0,d2
  7831.   ADD.w   d1,a3 ; Dest coordinate offset
  7832.   ADD.w   d1,a5 ; Dest stencil coordinate offset
  7833.   ADD.l   d2,a3 ; X2,Y2 in dest data
  7834.   ADD.l   d2,a5 ; X2,Y2 in dest stencil
  7835.   SUB.w   #16,d5 ; extra linemod
  7836.   ADD.w   d5,d7 ; dest
  7837.   JSR     PerformDoubleTile16x16 ; Block-Blit forwards
  7838.   MOVEM.l  (a7)+,a3-a5 ; Restore
  7839.   RTS
  7840.  
  7841. ;*************************************************************************************
  7842.  
  7843. _MDoubleTile32x32Short
  7844.   MOVE.w  d1,d2
  7845.   MOVE.w  d0,d1
  7846.   MOVE.w  CurrentChunkyShape1,d0
  7847. _MSTile32x32
  7848. _MDoubleTile32x32
  7849.   AND.b   #$E0,d1 ; Align X
  7850.   AND.b   #$E0,d2 ; Align Y
  7851.   MOVE.w  d0,d7 ; Store
  7852.   MOVE.w  CurrentChunkyBitmap1,d0 ; Dest resource
  7853.   !GetBitmapObjectPtr ; base in a0
  7854.   MOVE.l  a0,a1 ; Dest bitmap
  7855.   MOVE.w  d7,d0
  7856.   !GetShapeObjectPtr ; base in a0 - Source shape
  7857.   MOVEM.l a3-a5,-(a7) ; Store
  7858.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a2 ; source data
  7859.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a4 ; source cookie
  7860.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a3 ; dest data
  7861.   MOVE.l  CRsrc_Stencil-ChunkyResources(a1),a5 ; dest stencil
  7862.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d6 ; source modulo
  7863.   MOVE.w  CRsrc_LineMod-ChunkyResources(a1),d7 ; dest modulo
  7864.   TST.b   CRsrc_Wrapping-ChunkyResources(a1) ; Dest wrap?
  7865.   BEQ     _MDoubleTile32x32NoWrap
  7866.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a3
  7867.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a5
  7868. _MDoubleTile32x32NoWrap
  7869.   MOVE.w  d7,d0 ; Temp
  7870.   MOVE.w  CRsrc_Width-ChunkyResources(a1),d5
  7871.   ADD.w   d5,d0
  7872.   MULU    d0,d2
  7873.   ADD.w   d1,a3 ; Dest coordinate offset
  7874.   ADD.w   d1,a5 ; Dest stencil coordinate offset
  7875.   ADD.l   d2,a3 ; X2,Y2 in dest data
  7876.   ADD.l   d2,a5 ; X2,Y2 in dest stencil
  7877.   SUB.w   #32,d5 ; extra linemod
  7878.   ADD.w   d5,d7 ; dest
  7879.   JSR     PerformDoubleTile32x32 ; Block-Blit forwards
  7880.   MOVEM.l (a7)+,a3-a5 ; Restore
  7881.   RTS
  7882.  
  7883. ;*************************************************************************************
  7884.  
  7885. _MTripleTile16x16Short
  7886.   MOVE.w  d1,d2
  7887.   MOVE.w  d0,d1
  7888.   MOVE.w  CurrentChunkyShape1,d0
  7889. _MSTile16x16Store
  7890. _MTripleTile16x16
  7891.   AND.b   #$F0,d1 ; Align X
  7892.   AND.b   #$F0,d2 ; Align Y
  7893.   MOVE.w  d0,d7 ; Store
  7894.   MOVE.w  CurrentChunkyBitmap1,d0 ; Dest resource
  7895.   !GetBitmapObjectPtr ; base in a0
  7896.   MOVEM.l a3-a6,-(a7) ; Store
  7897.   MOVE.l  a0,a1 ; Dest bitmap
  7898.   MOVE.w  CurrentChunkyBitmap2,d0 ; Store resource
  7899.   !GetBitmapObjectPtr ; base in a0
  7900.   MOVE.l  a0,a6 ; Store bitmap
  7901.   MOVE.w  d7,d0
  7902.   !GetShapeObjectPtr ; base in a0 - Source shape
  7903.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a2 ; source data
  7904.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a4 ; source cookie
  7905.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a3 ; dest data
  7906.   MOVE.l  CRsrc_Stencil-ChunkyResources(a1),a5 ; dest stencil
  7907.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d6 ; source modulo
  7908.   MOVE.w  CRsrc_LineMod-ChunkyResources(a1),d7 ; dest modulo
  7909.   TST.b   CRsrc_Wrapping-ChunkyResources(a1) ; Dest wrap?
  7910.   BEQ     _MTripleTile16x16NoWrap
  7911.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a3
  7912.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a5
  7913. _MTripleTile16x16NoWrap
  7914.   MOVE.w  d7,d0 ; Temp
  7915.   MOVE.w  CRsrc_Width-ChunkyResources(a1),d4
  7916.   ADD.w   d4,d0
  7917.   MOVE.w  d2,d5 ; Store for later
  7918.   MULU    d0,d2
  7919.   ADD.w   d1,a3 ; Dest coordinate offset
  7920.   ADD.w   d1,a5 ; Dest stencil coordinate offset
  7921.   ADD.l   d2,a3 ; X2,Y2 in dest data
  7922.   ADD.l   d2,a5 ; X2,Y2 in dest stencil
  7923.   SUB.w   #16,d4 ; extra linemod
  7924.   ADD.w   d4,d7 ; dest
  7925.   MOVE.l  CRsrc_Data-ChunkyResources(a6),a0 ; Store's data
  7926.   MOVE.w  CRsrc_Width-ChunkyResources(a6),d3
  7927.   MOVE.w  CRsrc_LineMod-ChunkyResources(a6),d0
  7928.   ADD.w   d3,d0
  7929.   MULU    d0,d5
  7930.   ADD.w   d1,a0 ; Store's coordinate offset
  7931.   ADD.l   d5,a0 ; X2,Y2 in store data
  7932.   SUB.w   #16,d3 ; extra linemod
  7933.   MOVE.w  CRsrc_LineMod-ChunkyResources(a6),d5 ; Store's linemod
  7934.   ADD.w   d3,d5 ; dest
  7935.   TST.b   CRsrc_Wrapping-ChunkyResources(a6) ; Store wraps?
  7936.   BEQ     _MTripleTile16x16NoWrap2
  7937.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a6),a0
  7938. _MTripleTile16x16NoWrap2
  7939.   JSR     PerformTripleTile16x16 ; Block-Blit forwards
  7940.   MOVEM.l  (a7)+,a3-a6 ; Restore
  7941.   RTS
  7942.  
  7943. ;*************************************************************************************
  7944.  
  7945. _MTripleTile32x32Short
  7946.   MOVE.w  d1,d2
  7947.   MOVE.w  d0,d1
  7948.   MOVE.w  CurrentChunkyShape1,d0
  7949. _MSTile32x32Store
  7950. _MTripleTile32x32
  7951.   AND.b   #$E0,d1 ; Align X
  7952.   AND.b   #$E0,d2 ; Align Y
  7953.   MOVE.w  d0,d7 ; Store
  7954.   MOVE.w  CurrentChunkyBitmap1,d0 ; Dest resource
  7955.   !GetBitmapObjectPtr ; base in a0
  7956.   MOVEM.l a3-a6,-(a7) ; Store
  7957.   MOVE.l  a0,a1 ; Dest bitmap
  7958.   MOVE.w  CurrentChunkyBitmap2,d0 ; Store resource
  7959.   !GetBitmapObjectPtr ; base in a0
  7960.   MOVE.l  a0,a6 ; Store bitmap
  7961.   MOVE.w  d7,d0
  7962.   !GetShapeObjectPtr ; base in a0 - Source shape
  7963.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a2 ; source data
  7964.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a4 ; source cookie
  7965.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a3 ; dest data
  7966.   MOVE.l  CRsrc_Stencil-ChunkyResources(a1),a5 ; dest stencil
  7967.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d6 ; source modulo
  7968.   MOVE.w  CRsrc_LineMod-ChunkyResources(a1),d7 ; dest modulo
  7969.   TST.b   CRsrc_Wrapping-ChunkyResources(a1) ; Dest wrap?
  7970.   BEQ     _MTripleTile32x32NoWrap
  7971.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a3
  7972.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a5
  7973. _MTripleTile32x32NoWrap
  7974.   MOVE.w  d7,d0 ; Temp
  7975.   MOVE.w  CRsrc_Width-ChunkyResources(a1),d4
  7976.   ADD.w   d4,d0
  7977.   MOVE.w  d2,d5 ; Store for later
  7978.   MULU    d0,d2
  7979.   ADD.w   d1,a3 ; Dest coordinate offset
  7980.   ADD.w   d1,a5 ; Dest stencil coordinate offset
  7981.   ADD.l   d2,a3 ; X2,Y2 in dest data
  7982.   ADD.l   d2,a5 ; X2,Y2 in dest stencil
  7983.   SUB.w   #32,d4 ; extra linemod
  7984.   ADD.w   d4,d7 ; dest
  7985.   MOVE.l  CRsrc_Data-ChunkyResources(a6),a0 ; Store's data
  7986.   MOVE.w  CRsrc_Width-ChunkyResources(a6),d3
  7987.   MOVE.w  CRsrc_LineMod-ChunkyResources(a6),d0
  7988.   ADD.w   d3,d0
  7989.   MULU    d0,d5
  7990.   ADD.w   d1,a0 ; Store's coordinate offset
  7991.   ADD.l   d5,a0 ; X2,Y2 in store data
  7992.   SUB.w   #32,d3 ; extra linemod
  7993.   MOVE.w  CRsrc_LineMod-ChunkyResources(a6),d5 ; Store's linemod
  7994.   ADD.w   d3,d5 ; dest
  7995.   TST.b   CRsrc_Wrapping-ChunkyResources(a6) ; Store wraps?
  7996.   BEQ     _MTripleTile32x32NoWrap2
  7997.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a6),a0
  7998. _MTripleTile32x32NoWrap2
  7999.   JSR     PerformTripleTile32x32 ; Block-Blit forwards
  8000.   MOVEM.l (a7)+,a3-a6 ; Restore
  8001.   RTS
  8002.  
  8003. ;*************************************************************************************
  8004.  
  8005. _MTile16x16TwiceShort
  8006.   MOVE.w  d1,d2
  8007.   MOVE.w  d0,d1
  8008.   MOVE.w  CurrentChunkyShape1,d0
  8009. _MTile16x16Store
  8010. _MTile16x16Twice
  8011.   AND.b   #$F0,d1 ; Align X
  8012.   AND.b   #$F0,d2 ; Align Y
  8013.   MOVE.w  d0,d7 ; Store
  8014.   MOVE.w  CurrentChunkyBitmap1,d0 ; Dest resource
  8015.   !GetBitmapObjectPtr ; base in a0
  8016.   MOVEM.l a3/a4,-(a7) ; Store
  8017.   MOVE.l  a0,a1 ; Dest bitmap
  8018.   MOVE.w  CurrentChunkyBitmap2,d0 ; Store resource
  8019.   !GetBitmapObjectPtr ; base in a0
  8020.   MOVE.l  a0,a4 ; Store bitmap
  8021.   MOVE.w  d7,d0
  8022.   !GetShapeObjectPtr ; base in a0 - Source shape
  8023.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a2 ; source data
  8024.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a3 ; dest data
  8025.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d6 ; source modulo
  8026.   MOVE.w  CRsrc_LineMod-ChunkyResources(a1),d7 ; dest modulo
  8027.   TST.b   CRsrc_Wrapping-ChunkyResources(a1) ; Dest wrap?
  8028.   BEQ     _MTile16x16TwiceNoWrap
  8029.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a3
  8030. _MTile16x16TwiceNoWrap
  8031.   MOVE.w  d7,d0 ; Temp
  8032.   MOVE.w  CRsrc_Width-ChunkyResources(a1),d4
  8033.   ADD.w   d4,d0
  8034.   MOVE.w  d2,d5 ; Store for later
  8035.   MULU    d0,d2
  8036.   ADD.w   d1,a3 ; Dest coordinate offset
  8037.   ADD.l   d2,a3 ; X2,Y2 in dest data
  8038.   SUB.w   #16,d4 ; extra linemod
  8039.   ADD.w   d4,d7 ; dest
  8040.   MOVE.l  CRsrc_Data-ChunkyResources(a4),a0 ; Store's data
  8041.   MOVE.w  CRsrc_Width-ChunkyResources(a4),d3
  8042.   MOVE.w  CRsrc_LineMod-ChunkyResources(a4),d0
  8043.   ADD.w   d3,d0
  8044.   MULU    d0,d5
  8045.   ADD.w   d1,a0 ; Store's coordinate offset
  8046.   ADD.l   d5,a0 ; X2,Y2 in store data
  8047.   SUB.w   #16,d3 ; extra linemod
  8048.   MOVE.w  CRsrc_LineMod-ChunkyResources(a4),d5 ; Store's linemod
  8049.   ADD.w   d3,d5 ; dest
  8050.   TST.b   CRsrc_Wrapping-ChunkyResources(a4) ; Store wraps?
  8051.   BEQ     _MTile16x16TwiceNoWrap2
  8052.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a4),a0
  8053. _MTile16x16TwiceNoWrap2
  8054.   JSR     PerformTile16x16Twice ; Block-Blit forwards
  8055.   MOVEM.l (a7)+,a3/a4 ; Restore
  8056.   RTS
  8057.  
  8058. ;*************************************************************************************
  8059.  
  8060. _MTile32x32TwiceShort
  8061.   MOVE.w  d1,d2
  8062.   MOVE.w  d0,d1
  8063.   MOVE.w  CurrentChunkyShape1,d0
  8064. _MTile32x32Store
  8065. _MTile32x32Twice
  8066.   AND.b   #$E0,d1 ; Align X
  8067.   AND.b   #$E0,d2 ; Align Y
  8068.   MOVE.w  d0,d7 ; Store
  8069.   MOVE.w  CurrentChunkyBitmap1,d0 ; Dest resource
  8070.   !GetBitmapObjectPtr ; base in a0
  8071.   MOVEM.l a3-a4,-(a7) ; Store
  8072.   MOVE.l  a0,a1 ; Dest bitmap
  8073.   MOVE.w  CurrentChunkyBitmap2,d0 ; Store resource
  8074.   !GetBitmapObjectPtr ; base in a0
  8075.   MOVE.l  a0,a4 ; Store bitmap
  8076.   MOVE.w  d7,d0
  8077.   !GetShapeObjectPtr ; base in a0 - Source shape
  8078.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a2 ; source data
  8079.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a3 ; dest data
  8080.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d6 ; source modulo
  8081.   MOVE.w  CRsrc_LineMod-ChunkyResources(a1),d7 ; dest modulo
  8082.   TST.b   CRsrc_Wrapping-ChunkyResources(a1) ; Dest wrap?
  8083.   BEQ     _MTile32x32TwiceNoWrap
  8084.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a3
  8085. _MTile32x32TwiceNoWrap
  8086.   MOVE.w  d7,d0 ; Temp
  8087.   MOVE.w  CRsrc_Width-ChunkyResources(a1),d4
  8088.   ADD.w   d4,d0
  8089.   MOVE.w  d2,d5 ; Store for later
  8090.   MULU    d0,d2
  8091.   ADD.w   d1,a3 ; Dest coordinate offset
  8092.   ADD.l   d2,a3 ; X2,Y2 in dest data
  8093.   SUB.w   #32,d4 ; extra linemod
  8094.   ADD.w   d4,d7 ; dest
  8095.   MOVE.l  CRsrc_Data-ChunkyResources(a4),a0 ; Store's data
  8096.   MOVE.w  CRsrc_Width-ChunkyResources(a4),d3
  8097.   MOVE.w  CRsrc_LineMod-ChunkyResources(a4),d0
  8098.   ADD.w   d3,d0
  8099.   MULU    d0,d5
  8100.   ADD.w   d1,a0 ; Store's coordinate offset
  8101.   ADD.l   d5,a0 ; X2,Y2 in store data
  8102.   SUB.w   #32,d3 ; extra linemod
  8103.   MOVE.w  CRsrc_LineMod-ChunkyResources(a4),d5 ; Store's linemod
  8104.   ADD.w   d3,d5 ; dest
  8105.   TST.b   CRsrc_Wrapping-ChunkyResources(a4) ; Store wraps?
  8106.   BEQ     _MTile32x32TwiceNoWrap2
  8107.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a4),a0
  8108. _MTile32x32TwiceNoWrap2
  8109.   JSR     PerformTile32x32Twice ; Block-Blit forwards
  8110.   MOVEM.l (a7)+,a3-a4 ; Restore
  8111.   RTS
  8112.  
  8113. ;*************************************************************************************
  8114. _MReserveQueues
  8115. _MReserveChunkyQueues
  8116. ;Reserve memory for ChunkyQueue structures
  8117.   MOVE.l  d0,d7
  8118.   TST.l   ChunkyQueuesMem ; Check for existing mem allocated
  8119.   BEQ     ReserveChunkyQskip ; If exists, deallocate
  8120.   MOVE.w  ChunkyQueuesTotal,d0
  8121.   EXT.l   d0
  8122.   LSL.l   #ChunkyQueueStructSize,d0
  8123.   MOVE.l  ChunkyQueuesMem,a1
  8124.   ALibJsr #BlitzFreemem ; Free memory
  8125.   MOVE.l  d7,d0
  8126.   MOVE.w  #0,ChunkyQueuesTotal
  8127.   MOVE.l  #0,ChunkyQueuesMem
  8128. ReserveChunkyQskip
  8129.   AND.l   #$FFFF,d0
  8130.   MOVE.w  d0,d7
  8131.   LSL.l   #ChunkyQueueStructSize,d0
  8132.   MOVE.l  #ClearPublicMem,d1 ; MemType (public and clear)
  8133.   !CheckAvailMem{004}
  8134.   TST.b   d2 ; Likely?
  8135.   BEQ     ReserveChunkyQfailed
  8136.   ALibJsr #BlitzAllocmem ; Allocate memory
  8137.   TST.l   d0
  8138.   BEQ     ReserveChunkyQfailed
  8139.   MOVE.l  d0,ChunkyQueuesMem
  8140.   MOVE.w  d7,ChunkyQueuesTotal
  8141.   RTS     ; Return memory address in d0.l
  8142. ReserveChunkyQfailed
  8143.   MOVEQ.l #0,d0 ; Errorcode
  8144.   RTS
  8145.  
  8146. ;*************************************************************************************
  8147.  
  8148. _MFreeChunkyQueuesRange
  8149. ;Free a range of ChunkyQueue objects
  8150.   SUB.w   d0,d1 ; Total
  8151.   MOVE.w  d1,d7 ; Loopcounter, no need for -1
  8152.   MOVE.w  d0,d4 ; Start offset
  8153. FreeCQRloop
  8154.   MOVE.w  d7,d0
  8155.   ADD.w   d4,d0
  8156.   BSR     _MFreeChunkyQueue ; Free it
  8157.   DBRA    d7,FreeCQRloop
  8158.   RTS
  8159. _MFreeQueues
  8160. _MFreeChunkyQueues
  8161. ;Free all ChunkyQueue objects
  8162.   MOVE.w  ChunkyQueuesTotal,d7
  8163.   SUBQ.w  #1,d7 ; loopcounter
  8164. FreeCQloop
  8165.   MOVE.w  d7,d0
  8166.   BSR     _MFreeChunkyQueue ; Free it
  8167.   DBRA    d7,FreeCQloop
  8168. FreeCQsSkip
  8169.   RTS
  8170. _MFreeQueue
  8171. _MFreeChunkyQueue
  8172. ;Free a single ChunkyQueue object
  8173.   !GetQueueObjectPtr ; Get base of struct in a0
  8174. _MFreeChunkyQueueEntry
  8175.   MOVE.l  d0,-(a7) ; Store
  8176.   TST.l   CQueue_LMem-ChunkyResources(a0) ; List memory exist?
  8177.   BEQ     FreeQNoList
  8178.   MOVE.l  CQueue_LBytes-ChunkyQueues(a0),d0 ; Size
  8179.   MOVE.l  CQueue_LMem-ChunkyQueues(a0),a1 ; Mem address
  8180.   ALibJsr #BlitzFreemem ; Free data memory
  8181. FreeQNoList
  8182.   MOVE.l  #0,CQueue_LMem-ChunkyQueues(a0) ; Wipe LMem to indicate dead structure
  8183.   MOVE.l  (a7)+,d0 ; Restore
  8184.   RTS
  8185.  
  8186. ;*************************************************************************************
  8187. _MAddrChunkyQueueShort
  8188.   MOVE.w  CurrentChunkyQueue1,d0
  8189. _MAddrQueue
  8190. _MAddrChunkyQueue
  8191. ;Returns the address of the specified ChunkyQueue structure
  8192.   !GetQueueObjectPtr ; In a0
  8193.   MOVE.l  a0,d0 ; Return address
  8194.   RTS
  8195.  
  8196. ;*************************************************************************************
  8197. _MQueue
  8198. _MChunkyQueue
  8199. ;Initialise a new ChunkyQueue object
  8200.   !GetQueueObjectPtr ; Get base of struct
  8201.   MOVE.l  a0,a2 ; Store base pointer
  8202.   MOVE.w  d0,d7 ; Store
  8203.   EXT.l   d1
  8204.   MOVE.w  d1,d0
  8205.   TST.l   CQueue_LMem-ChunkyQueues(a0) ; Has mem?
  8206.   BEQ     _MChunkyQSkip
  8207.   BSR     _MFreeChunkyQueueEntry ; Deallocate existing data
  8208. _MChunkyQSkip
  8209.   MOVE.w  d0,CQueue_MaxItems-ChunkyQueues(a0) ; Total number of items allowed
  8210.   MOVE.w  #0,CQueue_Items-ChunkyQueues(a0) ; Number of actual items
  8211.   LSL.l   #ChunkyQueueListStructSize,d0
  8212.   MOVE.l  d0,CQueue_LBytes-ChunkyQueues(a0)
  8213.   !NewChunkyMem{007} ; Returns address in d0
  8214.   MOVE.l  a2,a0
  8215.   TST.b   d2
  8216.   BEQ     _MChunkyQFailed
  8217.   MOVE.l  d0,CQueue_LMem-ChunkyQueues(a0)
  8218.   MOVE.l  d0,CQueue_ItemAddr-ChunkyQueues(a0) ; Address of current item
  8219.   TST.b   AutoChunkyQueuesUse ; Use it?
  8220.   BEQ     _MChunkyQDontUse ; No
  8221.   MOVE.w  d7,CurrentChunkyQueue1 ; Yes, store queue number in current
  8222. _MChunkyQDontUse
  8223.   RTS     ; Successful, return
  8224.  
  8225. _MChunkyQFailed
  8226.   MOVEQ.l #0,d0
  8227.   MOVE.l  #0,CQueue_LMem-ChunkyQueues(a0)
  8228.   RTS     ; Return errorcode in d0
  8229.  
  8230. ;*************************************************************************************
  8231. _MFlushQueue
  8232. _MFlushChunkyQueue
  8233. ;Empty the contents of a queue as if ignoring its contents
  8234.   !GetQueueObjectPtr ; base in a0
  8235.   MOVE.l  CQueue_LMem-ChunkyQueues(a0),CQueue_ItemAddr-ChunkyQueues(a0) ; Init queue
  8236.   MOVE.w  #0,CQueue_Items-ChunkyQueues(a0) ; No items
  8237.   RTS
  8238.  
  8239. ;*************************************************************************************
  8240.  
  8241. _MQBlitModeShort
  8242.   MOVE.w  _QBlitModeType,d0
  8243.   EXT.l   d0 ; Return current mode in d0
  8244.   RTS
  8245. _MQBlitMode
  8246. ;Set blit mode type for `MQBlit'
  8247.   CMP.w   #8,d0 ; Direct?
  8248.   BGE     _MQBlitModeJump
  8249.   MOVE.w  d0,_QBlitModeType ; Directly copy type number
  8250.   RTS
  8251. _MQBlitModeJump
  8252.   CMP.w   #_CookieMode,d0 ; CookieMode?
  8253.   BNE     _MQBlitModeSkip
  8254.   MOVE.w  #0,_QBlitModeType ; Store type for CookieMode
  8255.   RTS
  8256. _MQBlitModeSkip
  8257.   CMP.w   #_EraseMode,d0 ; EraseMode?
  8258.   BNE     _MQBlitModeSkip2
  8259.   MOVE.w  #1,_QBlitModeType ; Store type for EraseMode
  8260.   RTS
  8261. _MQBlitModeSkip2
  8262.   CMP.w   #_InvMode,d0 ; InvMode?
  8263.   BNE     _MQBlitModeSkip3
  8264.   MOVE.w  #2,_QBlitModeType ; Store type for InvMode
  8265.   RTS
  8266. _MQBlitModeSkip3
  8267.   CMP.w   #_SolidMode,d0 ; SolidMode?
  8268.   BNE     _MQBlitModeSkip4
  8269.   MOVE.w  #3,_QBlitModeType ; Store type for SolidMode
  8270.   RTS
  8271. _MQBlitModeSkip4
  8272.   RTS
  8273.  
  8274. ;*************************************************************************************
  8275. _MAutoUseQueues
  8276. _MAutoUseChunkyQueues
  8277.   MOVE.b  d0,AutoChunkyQueuesUse
  8278.   RTS
  8279.  
  8280. ;*************************************************************************************
  8281. _MUseQueue
  8282. _MUseChunkyQueue
  8283. ;Set the currently used ChunkyQueues
  8284.   MOVE.w  d2,CurrentChunkyQueue3
  8285. _MUseChunkyQueueShort
  8286.   MOVE.w  d1,CurrentChunkyQueue2
  8287. _MUseChunkyQueueShortest
  8288.   MOVE.w  d0,CurrentChunkyQueue1
  8289.   RTS
  8290.  
  8291. ;*************************************************************************************
  8292. _MUsedQueue
  8293. _MUsedChunkyQueue
  8294. ;Returns number of main currently used ChunkyQueue, or likely -1 if not defined
  8295.   MOVE.w  CurrentChunkyQueue1,d0
  8296.   RTS
  8297.  
  8298. ;*************************************************************************************
  8299.  
  8300. _MQBlitShortest
  8301.   MOVE.w  d1,d3
  8302.   MOVE.w  d0,d2
  8303.   MOVE.w  CurrentChunkyShape1,d1
  8304.   MOVE.w  CurrentChunkyQueue1,d0
  8305.   BRA     _MQBlit
  8306. _MQBlitShort
  8307.   MOVE.w  d2,d3
  8308.   MOVE.w  d1,d2
  8309.   MOVE.w  d0,d1
  8310.   MOVE.w  CurrentChunkyQueue1,d0
  8311. _MQBlit
  8312. ;Scroll a whole Shape to a Bitmap and add entry to a queue
  8313.   !GetQueueObjectPtr ; base in a0
  8314.   MOVEM.l a3/a4/a6,-(a7) ; Store
  8315.   MOVE.l  CQueue_ItemAddr-ChunkyQueues(a0),a6 ; New item position
  8316.   ADD.w   #1,CQueue_Items-ChunkyQueues(a0) ; Items+1
  8317.   ADD.l   #ChunkyQueueListStructBytes,CQueue_ItemAddr-ChunkyQueues(a0) ; Incrememt address
  8318.   MOVE.w  d1,d7 ; Store shape
  8319.   MOVE.w  d2,d1
  8320.   MOVE.w  d3,d2
  8321.   MOVE.w  CurrentChunkyBitmap1,d0 ; Dest resource
  8322.   !GetBitmapObjectPtr ; base in a0
  8323.   MOVE.l  a0,a1 ; Dest bitmap
  8324.   MOVE.w  d7,d0 ; shape
  8325.   !GetShapeObjectPtr ; base in a0 - Source shape
  8326.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a2 ; source data
  8327.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a4 ; source stencil
  8328.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a3 ; dest data
  8329.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d6 ; source modulo
  8330.   MOVE.w  CRsrc_LineMod-ChunkyResources(a1),d7 ; dest modulo
  8331.   TST.b   CRsrc_Wrapping-ChunkyResources(a1) ; Dest wrap?
  8332.   BEQ     _MQBlitNoWrap
  8333.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a3
  8334. _MQBlitNoWrap
  8335.   SUB.w   CRsrc_XHandle-ChunkyResources(a0),d1 ; Adjust Xpos
  8336.   SUB.w   CRsrc_YHandle-ChunkyResources(a0),d2 ; Adjust Ypos
  8337.   MOVE.w  d7,d0 ; Temp modulo
  8338.   MOVE.w  CRsrc_Width-ChunkyResources(a1),d5
  8339.   ADD.w   d5,d0
  8340.   MULU    d0,d2
  8341.   ADD.w   d1,a3 ; Dest coordinate offset
  8342.   ADD.l   d2,a3 ; X2,Y2 in dest data
  8343.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d3 ; OpWidth
  8344.   SUB.w   d3,d5 ; extra linemod
  8345.   ADD.w   d5,d7 ; dest
  8346.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d4 ; OpHeight
  8347.   EXT.l   d1
  8348.   ADD.l   d1,d2
  8349.   EXT.l   d7
  8350.   MOVE.l  a3,(a6)+ ; Store queue list entry - Dest address
  8351.   MOVE.w  d3,(a6)+ ; Store queue list entry - OpWidth
  8352.   MOVE.w  d4,(a6)+ ; Store queue list entry - OpHeight
  8353.   MOVE.l  d7,(a6)+ ; Store queue list entry - Dest linemod
  8354.   MOVE.l  d2,(a6)  ; Store queue list entry - XYbytes not including wrap
  8355.   MOVE.w  _QBlitModeType,d0
  8356.   BSR     PerformBlit1 ; Blit forwards
  8357.   MOVEM.l (a7)+,a3/a4/a6 ; Restore
  8358.   RTS
  8359.  
  8360. ;*************************************************************************************
  8361.  
  8362. _MQBlockShortest
  8363.   MOVE.w  d1,d3
  8364.   MOVE.w  d0,d2
  8365.   MOVE.w  CurrentChunkyShape1,d1
  8366.   MOVE.w  CurrentChunkyQueue1,d0
  8367.   BRA     _MQBlock
  8368. _MQBlockShort
  8369.   MOVE.w  d2,d3
  8370.   MOVE.w  d1,d2
  8371.   MOVE.w  d0,d1
  8372.   MOVE.w  CurrentChunkyQueue1,d0
  8373. _MQBlock
  8374. ;Block-Scroll a whole Shape to a Bitmap and add entry to a queue
  8375.   !GetQueueObjectPtr ; base in a0
  8376.   MOVEM.l a3/a6,-(a7) ; Store
  8377.   MOVE.l  CQueue_ItemAddr-ChunkyQueues(a0),a6 ; New item position
  8378.   ADD.w   #1,CQueue_Items-ChunkyQueues(a0) ; Items+1
  8379.   ADD.l   #ChunkyQueueListStructBytes,CQueue_ItemAddr-ChunkyQueues(a0) ; Increment address
  8380.   MOVE.w  d1,d7 ; Store shape
  8381.   MOVE.w  d2,d1
  8382.   MOVE.w  d3,d2
  8383.   MOVE.w  CurrentChunkyBitmap1,d0 ; Dest resource
  8384.   !GetBitmapObjectPtr ; base in a0
  8385.   MOVE.l  a0,a1 ; Dest bitmap
  8386.   MOVE.w  d7,d0 ; shape
  8387.   !GetShapeObjectPtr ; base in a0 - Source shape
  8388.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a2 ; source data
  8389.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a3 ; dest data
  8390.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d6 ; source modulo
  8391.   MOVE.w  CRsrc_LineMod-ChunkyResources(a1),d7 ; dest modulo
  8392.   TST.b   CRsrc_Wrapping-ChunkyResources(a1) ; Dest wrap?
  8393.   BEQ     _MQBlockNoWrap
  8394.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a3
  8395. _MQBlockNoWrap
  8396.   SUB.w   CRsrc_XHandle-ChunkyResources(a0),d1 ; Adjust Xpos
  8397.   SUB.w   CRsrc_YHandle-ChunkyResources(a0),d2 ; Adjust Ypos
  8398.   AND.b   #$F0,d1 ; Align X
  8399.   MOVE.w  d7,d0 ; Temp modulo
  8400.   MOVE.w  CRsrc_Width-ChunkyResources(a1),d5
  8401.   ADD.w   d5,d0
  8402.   MULU    d0,d2
  8403.   ADD.w   d1,a3 ; Dest coordinate offset
  8404.   ADD.l   d2,a3 ; X2,Y2 in dest data
  8405.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d3 ; OpWidth
  8406.   SUB.w   d3,d5 ; extra linemod
  8407.   ADD.w   d5,d7 ; dest
  8408.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d4 ; OpHeight
  8409.   EXT.l   d1
  8410.   ADD.l   d1,d2
  8411.   EXT.l   d7
  8412.   MOVE.l  a3,(a6)+ ; Store queue list entry - Dest address
  8413.   MOVE.w  d3,(a6)+ ; Store queue list entry - OpWidth
  8414.   MOVE.w  d4,(a6)+ ; Store queue list entry - OpHeight
  8415.   MOVE.l  d7,(a6)+ ; Store queue list entry - Dest linemod
  8416.   MOVE.l  d2,(a6)  ; Store queue list entry - XYbytes not including wrap
  8417.   BSR     PerformGenericBlit4 ; Block-Blit forwards
  8418.   MOVEM.l (a7)+,a3/a6 ; Restore
  8419.   RTS
  8420.  
  8421. ;*************************************************************************************
  8422.  
  8423. _MUnQueueRangeShort
  8424. ;UnQueue a range of the queued objects to the dest bitmap by way of a clearscreen
  8425.   !GetQueueObjectPtr ; Base in a0
  8426.   MOVE.l  CQueue_LMem-ChunkyQueues(a0),a1 ; Base of queue
  8427.   SUB.w   d1,d2 ; Find loopcounter
  8428.   EXT.l   d1
  8429.   LSL.l   #ChunkyQueueListStructSize,d1 ; Offset
  8430.   ADD.l   d1,a1 ; Find list item in queue
  8431.   MOVE.w  d2,d1 ; Position
  8432.   BRA     _MUnQueueShortEntry
  8433. _MUnQueueShort
  8434. ;UnQueue the queued objects to the dest bitmap by way of a clearscreen
  8435.   !GetQueueObjectPtr ; Base in a0
  8436.   MOVE.l  CQueue_LMem-ChunkyQueues(a0),a1 ; Base of queue
  8437.   MOVE.w  CQueue_Items-ChunkyQueues(a0),d1 ; Number of items
  8438.   SUBQ.w  #1,d1 ; QueueItemLoopcounter
  8439.   MOVE.w  #0,CQueue_Items-ChunkyQueues(a0) ; Empty
  8440.   MOVE.l  CQueue_LMem-ChunkyQueues(a0),CQueue_ItemAddr-ChunkyQueues(a0) ; Empty
  8441. _MUnQueueShortEntry
  8442.   MOVE.b  CurrentInk1,d4
  8443.   MOVE.b  d4,d6
  8444.   LSL.w   #8,d6
  8445.   MOVE.b  d4,d6
  8446.   SWAP    d6
  8447.   MOVE.b  d4,d6
  8448.   LSL.w   #8,d6
  8449.   MOVE.b  d4,d6 ; Colour to draw to (repeated 4 times)
  8450. _MUnQueueClsLoop
  8451.     MOVE.l  (a1)+,a0 ; Dest address
  8452.     MOVE.w  (a1)+,d2 ; Width
  8453.     MOVE.w  (a1)+,d3 ; Height
  8454.     MOVE.w  d2,d4 ; Copy width
  8455.     MOVE.w  d3,d5 ; Copy height
  8456.     MOVE.l  (a1)+,d7 ; LineModulo
  8457.     LSR.w   #2,d4 ; /4 for longwords
  8458.     SUBQ.w  #1,d5 ; YLoopcounter
  8459.     ADD.w   #ChunkyQueueListStructBytes-12,a1 ; Skip to next item
  8460.     SUBQ.w  #1,d4 ; XLoopcounter
  8461. _MUnQueueClsYLoop
  8462.       MOVE.w  d4,d2 ; XLoop
  8463. _MUnQueueClsXLoop
  8464.         MOVE.l  d6,(a0)+
  8465.         DBRA    d2,_MUnQueueClsXLoop
  8466.       ADD.w d7,a0
  8467.       DBRA    d5,_MUnQueueClsYLoop
  8468.     DBRA    d1,_MUnQueueClsLoop
  8469.   RTS
  8470.  
  8471. _MUnQueueRange
  8472. ;UnQueue a range of queued objects to the dest bitmap by way of a bitmap rubthrough
  8473.   !GetQueueObjectPtr ; Base in a0
  8474.   MOVE.w  d3,d0
  8475.   MOVE.l  CQueue_LMem-ChunkyQueues(a0),a1 ; Base of queue
  8476.   SUB.w   d1,d2 ; Find loopcounter
  8477.   EXT.l   d1
  8478.   LSL.l   #ChunkyQueueListStructSize,d1 ; Offset
  8479.   ADD.l   d1,a1 ; Find list item in queue
  8480.   MOVE.w  d2,d1 ; Position
  8481.   BRA     _MUnQueueEntry
  8482. _MUnQueue
  8483. ;UnQueue the queued objects to the dest bitmap by way of a bitmap rubthrough
  8484.   !GetQueueObjectPtr ; Base in a0
  8485.   MOVE.w  d1,d0
  8486.   MOVE.l  CQueue_LMem-ChunkyQueues(a0),a1 ; Base of queue
  8487.   MOVE.w  CQueue_Items-ChunkyQueues(a0),d1 ; Number of items
  8488.   MOVE.w  #0,CQueue_Items-ChunkyQueues(a0) ; Empty
  8489.   SUBQ.w  #1,d1 ; QueueItemLoopcounter
  8490.   MOVE.l  CQueue_LMem-ChunkyQueues(a0),CQueue_ItemAddr-ChunkyQueues(a0) ; Empty
  8491. _MUnQueueEntry
  8492.   !GetBitmapObjectPtr ; Base in a0 - bitmap to use
  8493.   MOVE.l  CRsrc_Data-ChunkyResources(a0),d5 ; Source Data
  8494.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  8495.   BEQ     _MUnQueueNoWrap
  8496.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),d5
  8497. _MUnQueueNoWrap
  8498.   MOVE.l  a3,-(a7) ; Store
  8499.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),a3
  8500.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d4
  8501. _MUnQueueBitmapLoop
  8502.     MOVE.l  (a1)+,a0 ; Dest address
  8503.     MOVE.w  d4,d6 ; Copy source width
  8504.     MOVE.w  (a1)+,d2 ; Width
  8505.     MOVE.l  d5,a2 ; Source base
  8506.     MOVE.b  d2,d7 ; Copy Width
  8507.     MOVE.w  (a1)+,d3 ; Height
  8508.     AND.b   #$0F,d7 ; Mask Width for multiple of 16
  8509.     BEQ     _MUnQueueBitmap16
  8510.     SUB.w   d2,d6 ; Modulo
  8511.     MOVE.l  (a1)+,d7 ; Dest LineModulo
  8512.     SUBQ.w  #1,d3 ; YLoopcounter
  8513.     LSR.w   #2,d2 ; Width/4 for longwords
  8514.     ADD.l   (a1)+,a2 ; Position source
  8515.     SUBQ.w  #1,d2 ; XLoopcounter
  8516.     ADD.w   a3,d6 ; Total modulo
  8517. _MUnQueueBitmapYLoop
  8518.       MOVE.w  d2,d0 ; XLoop
  8519. _MUnQueueBitmapXLoop
  8520.         MOVE.l  (a2)+,(a0)+ ; Copy data
  8521.         DBRA  d0,_MUnQueueBitmapXLoop
  8522.       ADD.w d6,a2 ; Source linemod to data
  8523.       ADD.w d7,a0 ; Dest linemod to data
  8524.       DBRA  d3,_MUnQueueBitmapYLoop
  8525.     DBRA  d1,_MUnQueueBitmapLoop
  8526.   MOVE.l (a7)+,a3 ; Restore
  8527.   RTS;pop
  8528. _MUnQueueBitmap16
  8529.     SUB.w   d2,d6 ; Modulo
  8530.     MOVE.l  (a1)+,d7 ; Dest LineModulo
  8531.     SUBQ.w  #1,d3 ; YLoopcounter
  8532.     LSR.w   #4,d2 ; Width/16 for groups of 4 longwords
  8533.     ADD.l   (a1)+,a2 ; Position source
  8534.     SUBQ.w  #1,d2 ; XLoopcounter
  8535.     ADD.w   a3,d6 ; Total modulo
  8536. _MUnQueueBitmap16YLoop
  8537.       MOVE.w  d2,d0 ; XLoop
  8538. _MUnQueueBitmap16XLoop
  8539.         MOVE.l  (a2)+,(a0)+ ; Copy data
  8540.         MOVE.l  (a2)+,(a0)+ ; Copy data
  8541.         MOVE.l  (a2)+,(a0)+ ; Copy data
  8542.         MOVE.l  (a2)+,(a0)+ ; Copy data
  8543.         DBRA  d0,_MUnQueueBitmap16XLoop
  8544.       ADD.w d6,a2 ; Source linemod to data
  8545.       ADD.w d7,a0 ; Dest linemod to data
  8546.       DBRA  d3,_MUnQueueBitmap16YLoop
  8547.     DBRA  d1,_MUnQueueBitmapLoop
  8548.   MOVE.l (a7)+,a3 ; Restore
  8549.   RTS
  8550.  
  8551. ;*************************************************************************************
  8552.  
  8553. _MBitmapPtrAssume
  8554.   MOVE.w  CurrentChunkyBitmap1,d0
  8555. _MBitmapPtrShortest
  8556.   !GetBitmapObjectPtr ; Base in a0
  8557. _MBitmapPtrShortestEntry
  8558.   MOVE.l  CRsrc_Data-ChunkyResources(a0),d0 ; Chunky base address
  8559. _MBitmapPtrShortestEntry2
  8560.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  8561.   BEQ     _MBitmapPtrSkip
  8562.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),d0 ; Add wrap bytes
  8563. _MBitmapPtrSkip
  8564.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip offset?
  8565.   BEQ     _MBitmapPtrSkip2
  8566.   ADD.l   CRsrc_ClipBytes-ChunkyResources(a0),d0 ; Add clip bytes
  8567. _MBitmapPtrSkip2
  8568.   RTS     ; Return address in d0.l
  8569. _MBitmapPtrShort
  8570.   MOVE.w  CurrentChunkyBitmap1,d2
  8571. _MBitmapPtr
  8572. ;Return a pointer based on a bitmap, for use as the Chunky.l source of c2p() operation
  8573.   EXG.l   d0,d2 ; d2=xpos
  8574.   !GetBitmapObjectPtr ; Base in a0
  8575. _MBitmapPtrEntry
  8576.   MOVE.l  CRsrc_Data-ChunkyResources(a0),d0 ; Chunky base address
  8577. _MBitmapPtrEntry2
  8578.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  8579.   BEQ     _MBitmapPtrSkip3
  8580.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),d0 ; Add wrap bytes
  8581. _MBitmapPtrSkip3
  8582.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip offset?
  8583.   BEQ     _MBitmapPtrSkip4
  8584.   ADD.l   CRsrc_ClipBytes-ChunkyResources(a0),d0 ; Add clip bytes
  8585. _MBitmapPtrSkip4
  8586.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d3
  8587.   MULU    d3,d1
  8588.   EXT.l   d2
  8589.   ADD.l   d2,d0
  8590.   ADD.l   d1,d0
  8591.   RTS     ; Return address in d0.l
  8592.  
  8593. ;*************************************************************************************
  8594.  
  8595. _MShapePtrAssume
  8596.   MOVE.w  CurrentChunkyShape1,d0
  8597. _MShapePtrShortest
  8598.   !GetShapeObjectPtr ; Base in a0
  8599.   BRA     _MBitmapPtrShortestEntry
  8600.  
  8601. _MShapePtrShort
  8602.   MOVE.w  CurrentChunkyShape1,d2
  8603. _MShapePtr
  8604.   EXG.l   d0,d2 ; d2=xpos
  8605.   !GetShapeObjectPtr ; Base in a0
  8606.   BRA     _MBitmapPtrEntry
  8607.  
  8608.   RTS ; Precauton, but wont be taken
  8609.  
  8610. ;*************************************************************************************
  8611.  
  8612. _MStencilPtrAssume
  8613.   MOVE.w  CurrentChunkyBitmap1,d0
  8614. _MStencilPtrShortest
  8615.   !GetBitmapObjectPtr ; Base in a0
  8616.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),d0 ; Stencil base address
  8617.   BRA     _MBitmapPtrShortestEntry2
  8618.  
  8619. _MStencilPtrShort
  8620.   MOVE.w  CurrentChunkyBitmap1,d2
  8621. _MStencilPtr
  8622.   EXG.l   d0,d2 ; d2=xpos
  8623.   !GetBitmapObjectPtr ; Base in a0
  8624.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),d0 ; Stencil base address
  8625.   BRA     _MBitmapPtrEntry2
  8626.  
  8627.   RTS ; Precauton, but wont be taken
  8628.  
  8629. ;*************************************************************************************
  8630.  
  8631. _MCookiePtrAssume
  8632.   MOVE.w  CurrentChunkyShape1,d0
  8633. _MCookiePtrShortest
  8634.   !GetShapeObjectPtr ; Base in a0
  8635.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),d0 ; Stencil base address
  8636.   BRA     _MBitmapPtrShortestEntry2
  8637.  
  8638. _MCookiePtrShort
  8639.   MOVE.w  CurrentChunkyShape1,d2
  8640. _MCookiePtr
  8641.   EXG.l   d0,d2 ; d2=xpos
  8642.   !GetShapeObjectPtr ; Base in a0
  8643.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),d0 ; Stencil base address
  8644.   BRA     _MBitmapPtrEntry2
  8645.  
  8646.   RTS ; Precauton, but wont be taken
  8647.  
  8648. ;*************************************************************************************
  8649.  
  8650. _MQDummyShort
  8651.   MOVE.w  d3,d4
  8652.   MOVE.w  d2,d3
  8653.   MOVE.w  d1,d2
  8654.   MOVE.w  d0,d1
  8655.   MOVE.w  CurrentChunkyQueue1,d0
  8656. _MQDummy
  8657. ;Add an entry to a queue without doing a blit
  8658.   EXG.l   d3,d1
  8659.   !RoundUpWidth{011}
  8660.   EXG.l   d3,d1
  8661.   MOVE.l  a3,-(a7) ; Store
  8662.   !GetQueueObjectPtr ; base in a0
  8663.   MOVE.l  CQueue_ItemAddr-ChunkyQueues(a0),a2 ; New item position
  8664.   ADD.w   #1,CQueue_Items-ChunkyQueues(a0) ; Items+1
  8665.   ADD.l   #ChunkyQueueListStructBytes,CQueue_ItemAddr-ChunkyQueues(a0) ; Incrememt address
  8666.   MOVE.w  CurrentChunkyBitmap1,d0 ; Dest resource
  8667.   !GetBitmapObjectPtr ; base in a0
  8668.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a3 ; dest data
  8669.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d7 ; dest modulo
  8670.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Dest wrap?
  8671.   BEQ     _MQDummyNoWrap
  8672.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a3
  8673. _MQDummyNoWrap
  8674.   MOVE.w  d7,d0 ; Temp modulo
  8675.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d5
  8676.   ADD.w   d5,d0
  8677.   MULU    d0,d2
  8678.   ADD.w   d1,a3 ; Dest coordinate offset
  8679.   ADD.l   d2,a3 ; X2,Y2 in dest data
  8680.   SUB.w   d3,d5 ; extra linemod
  8681.   ADD.w   d5,d7 ; dest
  8682.   EXT.l   d1
  8683.   ADD.l   d1,d2
  8684.   EXT.l   d7
  8685.   MOVE.l  a3,(a2)+ ; Store queue list entry - Dest address
  8686.   MOVE.w  d3,(a2)+ ; Store queue list entry - OpWidth
  8687.   MOVE.w  d4,(a2)+ ; Store queue list entry - OpHeight
  8688.   MOVE.l  d7,(a2)+ ; Store queue list entry - Dest linemod
  8689.   MOVE.l  d2,(a2)  ; Store queue list entry - XYbytes not including wrap
  8690.   MOVE.l  (a7)+,a3 ; Restore
  8691.   RTS
  8692.  
  8693. ;*************************************************************************************
  8694.  
  8695. _MDoubleBlitModeShort
  8696.   MOVE.w  _DoubleBlitModeType,d0
  8697.   EXT.l   d0 ; Return current mode in d0
  8698.   RTS
  8699. _MSBlitMode
  8700. _MDoubleBlitMode
  8701. ;Set blit mode type for `MDoubleBlit'
  8702.   CMP.w   #8,d0 ; Direct?
  8703.   BGE     _MDoubleBlitModeJump
  8704.   MOVE.w  d0,_DoubleBlitModeType ; Directly copy type number
  8705.   RTS
  8706. _MDoubleBlitModeJump
  8707.   CMP.w   #_CookieMode,d0 ; CookieMode?
  8708.   BNE     _MDoubleBlitModeSkip
  8709.   MOVE.w  #0,_DoubleBlitModeType ; Store type for CookieMode
  8710.   RTS
  8711. _MDoubleBlitModeSkip
  8712.   CMP.w   #_EraseMode,d0 ; EraseMode?
  8713.   BNE     _MDoubleBlitModeSkip2
  8714.   MOVE.w  #1,_DoubleBlitModeType ; Store type for EraseMode
  8715.   RTS
  8716. _MDoubleBlitModeSkip2
  8717.   CMP.w   #_InvMode,d0 ; InvMode?
  8718.   BNE     _MDoubleBlitModeSkip3
  8719.   MOVE.w  #2,_DoubleBlitModeType ; Store type for InvMode
  8720.   RTS
  8721. _MDoubleBlitModeSkip3
  8722.   CMP.w   #_SolidMode,d0 ; SolidMode?
  8723.   BNE     _MDoubleBlitModeSkip4
  8724.   MOVE.w  #3,_DoubleBlitModeType ; Store type for SolidMode
  8725.   RTS
  8726. _MDoubleBlitModeSkip4
  8727.   RTS
  8728.  
  8729. ;*************************************************************************************
  8730.  
  8731. _MDoubleBlitShort
  8732.   MOVE.w  d1,d2
  8733.   MOVE.w  d0,d1
  8734.   MOVE.w  CurrentChunkyShape1,d0
  8735. _MSBlit
  8736. _MDoubleBlit
  8737. ;Scroll a whole Shape to a Bitmap and copy the cookie to the stencil
  8738.   MOVE.w  d0,d7 ; Store
  8739.   MOVE.w  CurrentChunkyBitmap1,d0 ; Dest resource
  8740.   !GetBitmapObjectPtr ; base in a0
  8741.   MOVE.l  a0,a1 ; Dest bitmap
  8742.   MOVE.w  d7,d0
  8743.   !GetShapeObjectPtr ; base in a0 - Source shape
  8744.   MOVEM.l a3-a5,-(a7) ; Store
  8745.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a2 ; source data
  8746.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a4 ; source stencil
  8747.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a3 ; dest data
  8748.   MOVE.l  CRsrc_Stencil-ChunkyResources(a1),a5 ; dest stencil
  8749.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d6 ; source modulo
  8750.   MOVE.w  CRsrc_LineMod-ChunkyResources(a1),d7 ; dest modulo
  8751.   TST.b   CRsrc_Wrapping-ChunkyResources(a1) ; Dest wrap?
  8752.   BEQ     _MDoubleBlitNoWrap
  8753.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a3
  8754.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a5
  8755. _MDoubleBlitNoWrap
  8756.   SUB.w   CRsrc_XHandle-ChunkyResources(a0),d1 ; Adjust Xpos
  8757.   SUB.w   CRsrc_YHandle-ChunkyResources(a0),d2 ; Adjust Ypos
  8758.   MOVE.w  d7,d0 ; Temp
  8759.   MOVE.w  CRsrc_Width-ChunkyResources(a1),d5
  8760.   ADD.w   d5,d0
  8761.   MULU    d0,d2
  8762.   ADD.w   d1,a3 ; Dest coordinate offset
  8763.   ADD.l   d2,a3 ; X2,Y2 in dest data
  8764.   ADD.w   d1,a5 ; Dest stencil coordinate offset
  8765.   ADD.l   d2,a5 ; X2,Y2 in dest stencil
  8766.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d3 ; OpWidth
  8767.   SUB.w   d3,d5 ; extra linemod
  8768.   ADD.w   d5,d7 ; dest
  8769.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d4 ; OpHeight
  8770.   MOVE.w  _DoubleBlitModeType,d0
  8771.   TST.b   DoubleBlitMode ; What type of blit?
  8772.   BNE     _MDoubleBlitSkip
  8773.   BSR     PerformBlit2 ; Blit forwards, paste cookie to stencil
  8774.   BRA     _MDoubleBlitSkip2
  8775. _MDoubleBlitSkip
  8776.   BSR     PerformBlit3 ; Blit forwards, cut using cookie and stencil
  8777. _MDoubleBlitSkip2
  8778.   MOVEM.l (a7)+,a3-a5 ; Restore
  8779.   RTS
  8780.  
  8781. ;*************************************************************************************
  8782.  
  8783. _MDoubleBlockShort
  8784.   MOVE.w  d1,d2
  8785.   MOVE.w  d0,d1
  8786.   MOVE.w  CurrentChunkyShape1,d0
  8787. _MSBlock
  8788. _MDoubleBlock
  8789. ;Block-Scroll a whole Shape to a Bitmap and copy the cookie to the stencil
  8790.   MOVE.w  d0,d7 ; Store
  8791.   MOVE.w  CurrentChunkyBitmap1,d0 ; Dest resource
  8792.   !GetBitmapObjectPtr ; base in a0
  8793.   MOVE.l  a0,a1 ; Dest bitmap
  8794.   MOVE.w  d7,d0
  8795.   !GetShapeObjectPtr ; base in a0 - Source shape
  8796.   MOVEM.l a3-a5,-(a7) ; Store
  8797.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a2 ; source data
  8798.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a4 ; source stencil
  8799.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a3 ; dest data
  8800.   MOVE.l  CRsrc_Stencil-ChunkyResources(a1),a5 ; dest stencil
  8801.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d6 ; source modulo
  8802.   MOVE.w  CRsrc_LineMod-ChunkyResources(a1),d7 ; dest modulo
  8803.   TST.b   CRsrc_Wrapping-ChunkyResources(a1) ; Dest wrap?
  8804.   BEQ     _MDoubleBlockNoWrap
  8805.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a3
  8806.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a5
  8807. _MDoubleBlockNoWrap
  8808.   SUB.w   CRsrc_XHandle-ChunkyResources(a0),d1 ; Adjust Xpos
  8809.   SUB.w   CRsrc_YHandle-ChunkyResources(a0),d2 ; Adjust Ypos
  8810.   AND.b   #$F0,d1 ; Align X
  8811.   MOVE.w  d7,d0 ; Temp
  8812.   MOVE.w  CRsrc_Width-ChunkyResources(a1),d5
  8813.   ADD.w   d5,d0
  8814.   MULU    d0,d2
  8815.   ADD.w   d1,a3 ; Dest coordinate offset
  8816.   ADD.l   d2,a3 ; X2,Y2 in dest data
  8817.   ADD.w   d1,a5 ; Dest stencil coordinate offset
  8818.   ADD.l   d2,a5 ; X2,Y2 in dest data
  8819.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d3 ; OpWidth
  8820.   SUB.w   d3,d5 ; extra linemod
  8821.   ADD.w   d5,d7 ; dest
  8822.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d4 ; OpHeight
  8823.   TST.b   DoubleBlitMode
  8824.   BNE     _MDoubleBlockSkip
  8825.   BSR     PerformGenericBlit7 ; Block-Blit forwards, paste cookie to stencil
  8826.   BRA     _MDoubleBlockSkip2
  8827. _MDoubleBlockSkip
  8828.   BSR     PerformGenericBlit10 ; Block-Blit forwards, cut using cookie and stencil
  8829. _MDoubleBlockSkip2
  8830.   MOVEM.l (a7)+,a3-a5 ; Restore
  8831.   RTS
  8832.  
  8833. ;*************************************************************************************
  8834. _MSBlitCut
  8835. _MDoubleBlitCut
  8836. ;Set the type of blit to be used in the Double Blit commands
  8837.   MOVE.b  d0,DoubleBlitMode ; Set status
  8838.   RTS
  8839.  
  8840. ;*************************************************************************************
  8841.  
  8842. _MDoubleQBlitModeShort
  8843.   MOVE.w  _DoubleQBlitModeType,d0
  8844.   EXT.l   d0 ; Return current mode in d0
  8845.   RTS
  8846. _MQSBlitMode
  8847. _MDoubleQBlitMode
  8848. ;Set blit mode type for `MDoubleQBlit'
  8849.   CMP.w   #8,d0 ; Direct?
  8850.   BGE     _MDoubleQBlitModeJump
  8851.   MOVE.w  d0,_DoubleQBlitModeType ; Directly copy type number
  8852.   RTS
  8853. _MDoubleQBlitModeJump
  8854.   CMP.w   #_CookieMode,d0 ; CookieMode?
  8855.   BNE     _MDoubleQBlitModeSkip
  8856.   MOVE.w  #0,_DoubleQBlitModeType ; Store type for CookieMode
  8857.   RTS
  8858. _MDoubleQBlitModeSkip
  8859.   CMP.w   #_EraseMode,d0 ; EraseMode?
  8860.   BNE     _MDoubleQBlitModeSkip2
  8861.   MOVE.w  #1,_DoubleQBlitModeType ; Store type for EraseMode
  8862.   RTS
  8863. _MDoubleQBlitModeSkip2
  8864.   CMP.w   #_InvMode,d0 ; InvMode?
  8865.   BNE     _MDoubleQBlitModeSkip3
  8866.   MOVE.w  #2,_DoubleQBlitModeType ; Store type for InvMode
  8867.   RTS
  8868. _MDoubleQBlitModeSkip3
  8869.   CMP.w   #_SolidMode,d0 ; SolidMode?
  8870.   BNE     _MDoubleQBlitModeSkip4
  8871.   MOVE.w  #3,_DoubleQBlitModeType ; Store type for SolidMode
  8872.   RTS
  8873. _MDoubleQBlitModeSkip4
  8874.   RTS
  8875.  
  8876. ;*************************************************************************************
  8877.  
  8878. _MDoubleQBlitShortest
  8879.   MOVE.w  d1,d3
  8880.   MOVE.w  d0,d2
  8881.   MOVE.w  CurrentChunkyShape1,d1
  8882.   MOVE.w  CurrentChunkyQueue1,d0
  8883.   BRA     _MDoubleQBlit
  8884. _MDoubleQBlitShort
  8885.   MOVE.w  d2,d3
  8886.   MOVE.w  d1,d2
  8887.   MOVE.w  d0,d1
  8888.   MOVE.w  CurrentChunkyQueue1,d0
  8889. _MQSBlit
  8890. _MDoubleQBlit
  8891. ;Scroll a whole Shape to a Bitmap, cookie to stencil, and add entry to a queue
  8892.   !GetQueueObjectPtr ; base in a0
  8893.   MOVEM.l a3-a6,-(a7) ; Store
  8894.   MOVE.l  CQueue_ItemAddr-ChunkyQueues(a0),a6 ; New item position
  8895.   ADD.w   #1,CQueue_Items-ChunkyQueues(a0) ; Items+1
  8896.   ADD.l   #ChunkyQueueListStructBytes,CQueue_ItemAddr-ChunkyQueues(a0) ; Incrememt address
  8897.   MOVE.w  d1,d7 ; Store shape
  8898.   MOVE.w  d2,d1
  8899.   MOVE.w  d3,d2
  8900.   MOVE.w  CurrentChunkyBitmap1,d0 ; Dest resource
  8901.   !GetBitmapObjectPtr ; base in a0
  8902.   MOVE.l  a0,a1 ; Dest bitmap
  8903.   MOVE.w  d7,d0 ; shape
  8904.   !GetShapeObjectPtr ; base in a0 - Source shape
  8905.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a2 ; source data
  8906.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a4 ; source stencil
  8907.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a3 ; dest data
  8908.   MOVE.l  CRsrc_Stencil-ChunkyResources(a1),a5 ; dest stencil
  8909.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d6 ; source modulo
  8910.   MOVE.w  CRsrc_LineMod-ChunkyResources(a1),d7 ; dest modulo
  8911.   TST.b   CRsrc_Wrapping-ChunkyResources(a1) ; Dest wrap?
  8912.   BEQ     _MDoubleQBlitNoWrap
  8913.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a3
  8914.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a5
  8915. _MDoubleQBlitNoWrap
  8916.   SUB.w   CRsrc_XHandle-ChunkyResources(a0),d1 ; Adjust Xpos
  8917.   SUB.w   CRsrc_YHandle-ChunkyResources(a0),d2 ; Adjust Ypos
  8918.   MOVE.w  d7,d0 ; Temp modulo
  8919.   MOVE.w  CRsrc_Width-ChunkyResources(a1),d5
  8920.   ADD.w   d5,d0
  8921.   MULU    d0,d2
  8922.   ADD.w   d1,a3 ; Dest coordinate offset
  8923.   ADD.l   d2,a3 ; X2,Y2 in dest data
  8924.   ADD.w   d1,a5 ; Dest stencil coordinate offset
  8925.   ADD.l   d2,a5 ; X2,Y2 in dest stencil
  8926.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d3 ; OpWidth
  8927.   SUB.w   d3,d5 ; extra linemod
  8928.   ADD.w   d5,d7 ; dest
  8929.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d4 ; OpHeight
  8930.   EXT.l   d1
  8931.   ADD.l   d1,d2
  8932.   EXT.l   d7
  8933.   MOVE.l  a3,(a6)+ ; Store queue list entry - Dest address
  8934.   MOVE.w  d3,(a6)+ ; Store queue list entry - OpWidth
  8935.   MOVE.w  d4,(a6)+ ; Store queue list entry - OpHeight
  8936.   MOVE.l  d7,(a6)+ ; Store queue list entry - Dest linemod
  8937.   MOVE.l  d2,(a6)  ; Store queue list entry - XYbytes not including wrap
  8938.   MOVE.w  _DoubleQBlitModeType,d0
  8939.   TST.b   DoubleQBlitMode
  8940.   BNE     _MDoubleQBlitSkip
  8941.   BSR     PerformBlit2 ; Blit forwards, paste cookie to stencil
  8942.   BRA     _MDoubleQBlitSkip2
  8943. _MDoubleQBlitSkip
  8944.   BSR     PerformBlit3 ; Blit forwards, cut using cookie and stencil
  8945. _MDoubleQBlitSkip2
  8946.   MOVEM.l (a7)+,a3-a6 ; Restore
  8947.   RTS
  8948.  
  8949. ;*************************************************************************************
  8950.  
  8951. _MDoubleQBlockShortest
  8952.   MOVE.w  d1,d3
  8953.   MOVE.w  d0,d2
  8954.   MOVE.w  CurrentChunkyShape1,d1
  8955.   MOVE.w  CurrentChunkyQueue1,d0
  8956.   BRA     _MDoubleQBlock
  8957. _MDoubleQBlockShort
  8958.   MOVE.w  d2,d3
  8959.   MOVE.w  d1,d2
  8960.   MOVE.w  d0,d1
  8961.   MOVE.w  CurrentChunkyQueue1,d0
  8962. _MQSBlock
  8963. _MDoubleQBlock
  8964. ;Block-Scroll a whole Shape to a Bitmap, cookie to stencil, and add entry to a queue
  8965.   !GetQueueObjectPtr ; base in a0
  8966.   MOVEM.l a3-a6,-(a7) ; Store
  8967.   MOVE.l  CQueue_ItemAddr-ChunkyQueues(a0),a6 ; New item position
  8968.   ADD.w   #1,CQueue_Items-ChunkyQueues(a0) ; Items+1
  8969.   ADD.l   #ChunkyQueueListStructBytes,CQueue_ItemAddr-ChunkyQueues(a0) ; Increment address
  8970.   MOVE.w  d1,d7 ; Store shape
  8971.   MOVE.w  d2,d1
  8972.   MOVE.w  d3,d2
  8973.   MOVE.w  CurrentChunkyBitmap1,d0 ; Dest resource
  8974.   !GetBitmapObjectPtr ; base in a0
  8975.   MOVE.l  a0,a1 ; Dest bitmap
  8976.   MOVE.w  d7,d0 ; shape
  8977.   !GetShapeObjectPtr ; base in a0 - Source shape
  8978.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a2 ; source data
  8979.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a4 ; source stencil
  8980.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a3 ; dest data
  8981.   MOVE.l  CRsrc_Stencil-ChunkyResources(a1),a5 ; dest stencil
  8982.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d6 ; source modulo
  8983.   MOVE.w  CRsrc_LineMod-ChunkyResources(a1),d7 ; dest modulo
  8984.   TST.b   CRsrc_Wrapping-ChunkyResources(a1) ; Dest wrap?
  8985.   BEQ     _MDoubleQBlockNoWrap
  8986.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a3
  8987.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a5
  8988. _MDoubleQBlockNoWrap
  8989.   SUB.w   CRsrc_XHandle-ChunkyResources(a0),d1 ; Adjust Xpos
  8990.   SUB.w   CRsrc_YHandle-ChunkyResources(a0),d2 ; Adjust Ypos
  8991.   AND.b   #$F0,d1 ; Align X
  8992.   MOVE.w  d7,d0 ; Temp modulo
  8993.   MOVE.w  CRsrc_Width-ChunkyResources(a1),d5
  8994.   ADD.w   d5,d0
  8995.   MULU    d0,d2
  8996.   ADD.w   d1,a3 ; Dest coordinate offset
  8997.   ADD.l   d2,a3 ; X2,Y2 in dest data
  8998.   ADD.w   d1,a5 ; Dest stencil coordinate offset
  8999.   ADD.l   d2,a5 ; X2,Y2 in dest data
  9000.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d3 ; OpWidth
  9001.   SUB.w   d3,d5 ; extra linemod
  9002.   ADD.w   d5,d7 ; dest
  9003.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d4 ; OpHeight
  9004.   EXT.l   d1
  9005.   ADD.l   d1,d2
  9006.   EXT.l   d7
  9007.   MOVE.l  a3,(a6)+ ; Store queue list entry - Dest address
  9008.   MOVE.w  d3,(a6)+ ; Store queue list entry - OpWidth
  9009.   MOVE.w  d4,(a6)+ ; Store queue list entry - OpHeight
  9010.   MOVE.l  d7,(a6)+ ; Store queue list entry - Dest linemod
  9011.   MOVE.l  d2,(a6)  ; Store queue list entry - XYbytes not including wrap
  9012.   TST.b   DoubleQBlitMode
  9013.   BNE     _MDoubleQBlockSkip
  9014.   BSR     PerformGenericBlit7 ; Block-Blit forwards, paste cookie to stencil
  9015.   BRA     _MDoubleQBlockSkip2
  9016. _MDoubleQBlockSkip
  9017.   BSR     PerformGenericBlit10 ; Block-Blit forwards, cut using cookie and stencil
  9018. _MDoubleQBlockSkip2
  9019.   MOVEM.l (a7)+,a3-a6 ; Restore
  9020.   RTS
  9021.  
  9022. ;*************************************************************************************
  9023. _MQSBlitCut
  9024. _MDoubleQBlitCut
  9025. ;Set the type of blit to be used in the Double QBlit commands
  9026.   MOVE.b  d0,DoubleQBlitMode ; Set status
  9027.   RTS
  9028.  
  9029. ;*************************************************************************************
  9030.  
  9031. _MBoxFShort
  9032.   MOVEQ.l #0,d4
  9033.   MOVE.b  CurrentInk1,d4
  9034. _MBoxF
  9035. ;Draw a filled box to a bitmap in the specified colour or 0
  9036.   !PrepareCoords{001}
  9037.   SUB.w   d0,d2 ; Make Width
  9038.   SUB.w   d1,d3 ; Make Height
  9039.   ADDQ.w  #1,d2
  9040.   ADDQ.w  #1,d3
  9041.   MOVE.w  d0,d5 ; X1 store
  9042.   MOVE.w  CurrentChunkyBitmap1,d0 ; Bitmap to draw to
  9043.   !GetBitmapObjectPtr ; Base in a0
  9044.   MOVE.w  d5,d0 ; X1 restore
  9045.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Base of data
  9046.   JMP     PerformBoxF ; ignore rts
  9047.   RTS     ; Precaution
  9048.  
  9049. ;*************************************************************************************
  9050.  
  9051. _MBoxFShapeShort
  9052.   MOVEQ.l #0,d4
  9053.   MOVE.b  CurrentInk1,d4
  9054. _MBoxFShape
  9055. ;Draw a filled box to a bitmap in the specified colour or 0
  9056.   !PrepareCoords{002}
  9057.   SUB.w   d0,d2 ; Make Width
  9058.   SUB.w   d1,d3 ; Make Height
  9059.   ADDQ.w  #1,d2
  9060.   ADDQ.w  #1,d3
  9061.   MOVE.w  d0,d5 ; X1 store
  9062.   MOVE.w  CurrentChunkyShape1,d0 ; Shape to draw to
  9063.   !GetShapeObjectPtr ; Base in a0
  9064.   MOVE.w  d5,d0 ; X1 restore
  9065.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Base of data
  9066.   JMP     PerformBoxF ; ignore rts
  9067.   RTS     ; Precaution
  9068.  
  9069. ;*************************************************************************************
  9070.  
  9071. _MBoxFStencilShort
  9072.   MOVEQ.l #0,d4
  9073.   MOVE.b  CurrentInk1,d4
  9074. _MBoxFStencil
  9075. ;Draw a filled box to a stencil to represent the specified colour or 0
  9076.   !PrepareCoords{003}
  9077.   SUB.w   d0,d2 ; Make Width
  9078.   SUB.w   d1,d3 ; Make Height
  9079.   ADDQ.w  #1,d2
  9080.   ADDQ.w  #1,d3
  9081.   MOVE.w  d0,d5 ; X1 store
  9082.   MOVE.w  CurrentChunkyBitmap1,d0 ; Bitmap that has stencil to draw to
  9083.   !GetBitmapObjectPtr ; Base in a0
  9084.   MOVE.w  d5,d0 ; X1 restore
  9085.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a1 ; Base of stencil
  9086.   TST.b   d4
  9087.   SEQ     d4 ; Make stencil byte value
  9088.   MOVE.w  _DrawingModeType,d7
  9089.   CMP.b   #4,d7
  9090.   BLE     _MBoxFStencilSkip
  9091.   MOVE.w  d7,-(a7) ; Store
  9092.   MOVE.w  #4,_DrawingModeType ; Default to MColourMode instead of remapping
  9093.   JSR     PerformBoxF
  9094.   MOVE.w  (a7)+,_DrawingModeType ; Restore
  9095.   RTS
  9096. _MBoxFStencilSkip
  9097.   JMP     PerformBoxF ; ignore rts
  9098.   RTS     ; Precaution
  9099.  
  9100. ;*************************************************************************************
  9101.  
  9102. _MBoxFCookieShort
  9103.   MOVEQ.l #0,d4
  9104.   MOVE.b  CurrentInk1,d4
  9105. _MBoxFCookie
  9106. ;Draw a filled box to a cookie to represent the specified colour or 0
  9107.   !PrepareCoords{004}
  9108.   SUB.w   d0,d2 ; Make Width
  9109.   SUB.w   d1,d3 ; Make Height
  9110.   ADDQ.w  #1,d2
  9111.   ADDQ.w  #1,d3
  9112.   MOVE.w  d0,d5 ; X1 store
  9113.   MOVE.w  CurrentChunkyShape1,d0 ; Shape that has cookie to draw to
  9114.   !GetShapeObjectPtr ; Base in a0
  9115.   MOVE.w  d5,d0 ; X1 restore
  9116.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a1 ; Base of cookie
  9117.   TST.b   d4
  9118.   SEQ     d4 ; Make cookie byte value
  9119.   MOVE.w  _DrawingModeType,d7
  9120.   CMP.b   #4,d7
  9121.   BLE     _MBoxFCookieSkip
  9122.   MOVE.w  d7,-(a7) ; Store
  9123.   MOVE.w  #4,_DrawingModeType ; Default to MColourMode instead of remapping
  9124.   JSR     PerformBoxF
  9125.   MOVE.w  (a7)+,_DrawingModeType ; Restore
  9126.   RTS
  9127. _MBoxFCookieSkip
  9128.   JMP     PerformBoxF ; ignore rts
  9129.   RTS     ; Precaution
  9130.  
  9131. ;*************************************************************************************
  9132.  
  9133. _MBoxShort
  9134.   MOVEQ.l #0,d4
  9135.   MOVE.b  CurrentInk1,d4
  9136. _MBox
  9137. ;Draw an unfilled box to a bitmap in the specified colour or 0
  9138.   !PrepareCoords{005}
  9139.   SUB.w   d0,d2 ; Make Width
  9140.   SUB.w   d1,d3 ; Make Height
  9141.   ADDQ.w  #1,d2
  9142.   ADDQ.w  #1,d3
  9143.   MOVE.w  d0,d5 ; X1 store
  9144.   MOVE.w  CurrentChunkyBitmap1,d0 ; Bitmap to draw to
  9145.   !GetBitmapObjectPtr ; Base in a0
  9146.   MOVE.w  d5,d0 ; X1 restore
  9147.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Base of data
  9148.   JMP     PerformBox ; ignore rts
  9149.   RTS     ; Precaution
  9150.  
  9151. ;*************************************************************************************
  9152.  
  9153. _MBoxShapeShort
  9154.   MOVEQ.l #0,d4
  9155.   MOVE.b  CurrentInk1,d4
  9156. _MBoxShape
  9157. ;Draw an unfilled box to a bitmap in the specified colour or 0
  9158.   !PrepareCoords{006}
  9159.   SUB.w   d0,d2 ; Make Width
  9160.   SUB.w   d1,d3 ; Make Height
  9161.   ADDQ.w  #1,d2
  9162.   ADDQ.w  #1,d3
  9163.   MOVE.w  d0,d5 ; X1 store
  9164.   MOVE.w  CurrentChunkyShape1,d0 ; Shape to draw to
  9165.   !GetShapeObjectPtr ; Base in a0
  9166.   MOVE.w  d5,d0 ; X1 restore
  9167.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Base of data
  9168.   JMP     PerformBox ; ignore rts
  9169.   RTS     ; Precaution
  9170.  
  9171. ;*************************************************************************************
  9172.  
  9173. _MBoxStencilShort
  9174.   MOVEQ.l #0,d4
  9175.   MOVE.b  CurrentInk1,d4
  9176. _MBoxStencil
  9177. ;Draw an unfilled box to a stencil to represent the specified colour or 0
  9178.   !PrepareCoords{007}
  9179.   SUB.w   d0,d2 ; Make Width
  9180.   SUB.w   d1,d3 ; Make Height
  9181.   ADDQ.w  #1,d2
  9182.   ADDQ.w  #1,d3
  9183.   MOVE.w  d0,d5 ; X1 store
  9184.   MOVE.w  CurrentChunkyBitmap1,d0 ; Bitmap that has stencil to draw to
  9185.   !GetBitmapObjectPtr ; Base in a0
  9186.   MOVE.w  d5,d0 ; X1 restore
  9187.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a1 ; Base of stencil
  9188.   TST.b   d4
  9189.   SEQ     d4 ; Make stencil byte value
  9190.   MOVE.w  _DrawingModeType,d7
  9191.   CMP.b   #4,d7
  9192.   BLE     _MBoxStencilSkip
  9193.   MOVE.w  d7,-(a7) ; Store
  9194.   MOVE.w  #4,_DrawingModeType ; Default to MColourMode instead of remapping
  9195.   JSR     PerformBox
  9196.   MOVE.w  (a7)+,_DrawingModeType ; Restore
  9197.   RTS
  9198. _MBoxStencilSkip
  9199.   JMP     PerformBox ; ignore rts
  9200.   RTS     ; Precaution
  9201.  
  9202. ;*************************************************************************************
  9203.  
  9204. _MBoxCookieShort
  9205.   MOVEQ.l #0,d4
  9206.   MOVE.b  CurrentInk1,d4
  9207. _MBoxCookie
  9208. ;Draw an unfilled box to a cookie to represent the specified colour or 0
  9209.   !PrepareCoords{008}
  9210.   SUB.w   d0,d2 ; Make Width
  9211.   SUB.w   d1,d3 ; Make Height
  9212.   ADDQ.w  #1,d2
  9213.   ADDQ.w  #1,d3
  9214.   MOVE.w  d0,d5 ; X1 store
  9215.   MOVE.w  CurrentChunkyShape1,d0 ; Shape that has cookie to draw to
  9216.   !GetShapeObjectPtr ; Base in a0
  9217.   MOVE.w  d5,d0 ; X1 restore
  9218.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a1 ; Base of cookie
  9219.   TST.b   d4
  9220.   SEQ     d4 ; Make cookie byte value
  9221.   MOVE.w  _DrawingModeType,d7
  9222.   CMP.b   #4,d7
  9223.   BLE     _MBoxCookieSkip
  9224.   MOVE.w  d7,-(a7) ; Store
  9225.   MOVE.w  #4,_DrawingModeType ; Default to MColourMode instead of remapping
  9226.   JSR     PerformBox
  9227.   MOVE.w  (a7)+,_DrawingModeType ; Restore
  9228.   RTS
  9229. _MBoxCookieSkip
  9230.   JMP     PerformBox  ; ignore rts
  9231.   RTS     ; Precaution
  9232.  
  9233. ;*************************************************************************************
  9234.  
  9235. _MPlanar16ToBitmapShort
  9236.   !GetBitmapObjectPtr ; Base in a0
  9237.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d2 ; OpWidth
  9238.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d3 ; OpHeight
  9239.   MOVE.w  d2,d4 ; PlanarWidth
  9240.   MOVE.w  d3,d5 ; PlanarHeight
  9241. _MPlanar16ToBitmap
  9242. ;Convert 256-colour planar data to a chunky Bitmap object, width multiple of 16
  9243.   !GetBitmapObjectPtr ; Base in a0
  9244.   AND.b   #$F0,d2 ; OpWidth down to 16
  9245.   AND.b   #$F0,d4 ; PlanarWidth down to 16
  9246.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d7 ; Dest linemod
  9247.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Chunky
  9248.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Dest wrap?
  9249.   BEQ     _MPlanar16ToBitmapNoWrap
  9250.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1
  9251. _MPlanar16ToBitmapNoWrap
  9252.   JMP     PerformPlanar16ToChunky ; ignore rts
  9253.   RTS     ; Precaution
  9254.  
  9255. ;*************************************************************************************
  9256.  
  9257. _MPlanar16ToShapeShort
  9258.   !GetShapeObjectPtr ; Base in a0
  9259.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d2 ; OpWidth
  9260.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d3 ; OpHeight
  9261.   MOVE.w  d2,d4 ; PlanarWidth
  9262.   MOVE.w  d3,d5 ; PlanarHeight
  9263. _MPlanar16ToShape
  9264. ;Convert 256-colour planar data to a chunky Shape object, width multiple of 16
  9265.   !GetShapeObjectPtr ; Base in a0
  9266.   AND.b   #$F0,d2 ; OpWidth down to 16
  9267.   AND.b   #$F0,d4 ; PlanarWidth down to 16
  9268.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d7 ; Dest linemod
  9269.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Chunky
  9270.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Dest wrap?
  9271.   BEQ     _MPlanar16ToShapeNoWrap
  9272.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1
  9273. _MPlanar16ToShapeNoWrap
  9274.   JMP     PerformPlanar16ToChunky ; ignore rts
  9275.   RTS     ; Precaution
  9276.  
  9277. ;*************************************************************************************
  9278.  
  9279. _MGenericPtr
  9280. ;Given a base address, xpos, ypos, and width, work out an address and return it
  9281.   MULU    d3,d1 ; Width*Ypos
  9282.   EXT.l   d0
  9283.   ADD.l   d0,d1 ; Add Xpos
  9284.   ADD.l   d2,d1 ; Add base address
  9285.   MOVE.l  d1,d0 ; Return longword in d0.l
  9286.   RTS
  9287.  
  9288. ;*************************************************************************************
  9289.  
  9290. _MCludgeCookie
  9291. ;Cludge a new ChunkyShape's cookie from existing memory
  9292.   SUB.l   #16,d1 ; Prepare for alignment
  9293.   !GetShapeObjectPtr ; Get base of struct
  9294.   MOVE.l  a0,a2 ; Store base pointer
  9295.   MOVE.l  d1,d3 ; Mem
  9296.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d1 ; Width
  9297.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d2 ; Height
  9298.   !DeallocStencil{001} ; Deallocate existing cookie
  9299.   MOVE.l  a2,a0 ; Get base in a0
  9300.   MOVE.l  d3,d0 ; Store for return
  9301.   !StoreResourceStencilMemInfo2
  9302.   RTS     ; Return errorcode in d0
  9303.  
  9304. ;*************************************************************************************
  9305.  
  9306. _MCludgeStencil
  9307. ;Cludge a new ChunkyBitmap's stencil from existing memory
  9308.   SUB.l   #16,d1 ; Prepare for alignment
  9309.   !GetBitmapObjectPtr ; Get base of struct
  9310.   MOVE.l  a0,a2 ; Store base pointer
  9311.   MOVE.l  d1,d3 ; Mem
  9312.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d1 ; Width
  9313.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d2 ; Height
  9314.   !DeallocStencil{002} ; Deallocate existing stencil
  9315.   MOVE.l  a2,a0 ; Get base in a0
  9316.   MOVE.l  d3,d0 ; Store for return
  9317.   !StoreResourceStencilMemInfo2
  9318.   RTS     ; Return errorcode in d0
  9319.  
  9320. ;*************************************************************************************
  9321.  
  9322. _MReMapShortest
  9323.   MOVEQ.l #-1,d2 ; Use table
  9324.   MOVE.w  CurrentChunkyBitmap1,d1 ; Current bitmap
  9325. _MReMapShort
  9326.   MOVEQ.l #-1,d2 ; Use table
  9327.   MOVE.l  d0,a2 ; a2=Table address
  9328.   MOVE.w  d1,d0 ; d0=BitmapNum
  9329.   BRA     _MReMapJump
  9330. _MReMap
  9331. ;Remap d0colour to d1colour, or using a table, for a whole bitmap
  9332.   MOVE.w  d0,d5 ; d5=Colour0
  9333.   MOVE.w  d1,d6 ; d6=Colour1
  9334.   MOVE.w  d2,d0
  9335. _MReMapJump
  9336.   !GetBitmapObjectPtr ; Base in a0
  9337.   JMP     PerformReMap ; ignore rts
  9338.   RTS     ; Precaution
  9339.  
  9340. ;*************************************************************************************
  9341.  
  9342. _MReMapShapeShortest
  9343.   MOVEQ.l #-1,d2 ; Use table
  9344.   MOVE.w  CurrentChunkyShape1,d1 ; Current shape
  9345. _MReMapShapeShort
  9346.   MOVEQ.l #-1,d2 ; Use table
  9347.   MOVE.l  d0,a2 ; a2=Table address
  9348.   MOVE.w  d1,d0 ; d0=ShapeNum
  9349.   BRA     _MReMapShapeJump
  9350. _MReMapShape
  9351. ;Remap d0colour to d1colour, or using a table, for a whole shape
  9352.   MOVE.w  d0,d5 ; d5=Colour0
  9353.   MOVE.w  d1,d6 ; d6=Colour1
  9354.   MOVE.w  d2,d0
  9355. _MReMapShapeJump
  9356.   !GetShapeObjectPtr ; Base in a0
  9357.   JMP     PerformReMap ; ingnore rts
  9358.   RTS     ; Precaution
  9359.  
  9360. ;*************************************************************************************
  9361.  
  9362. _MLineShortest2
  9363.   MOVEQ.l #0,d2 ; Init
  9364.   MOVE.b  CurrentInk1,d2 ; Colour to use
  9365. _MLineShortest
  9366.   MOVE.w  d2,d4
  9367.   MOVE.w  d1,d3 ; Xpos2
  9368.   MOVE.w  d0,d2 ; Ypos2
  9369.   MOVE.w  LineLastXpos,d0
  9370.   MOVE.w  LineLastYpos,d1
  9371.   BRA     _MLine
  9372. _MLineShort
  9373.   MOVEQ.l #0,d4 ; Init
  9374.   MOVE.b  CurrentInk1,d4 ; Colour to use
  9375. _MLine
  9376. ;Draw a line to a Bitmap from X1,Y1 to X2,Y2 in the specified colour or ink
  9377.   MOVE.w  d2,LineLastXpos
  9378.   MOVE.w  d3,LineLastYpos
  9379.   MOVE.w  d0,d5 ; X1 store
  9380.   MOVE.w  CurrentChunkyBitmap1,d0 ; Bitmap to draw to
  9381.   !GetBitmapObjectPtr ; Base in a0
  9382.   MOVE.w  d5,d0 ; X1 restore
  9383.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Base of data
  9384.   JMP     PerformLine ; ignore rts
  9385.   RTS     ; Precaution
  9386.  
  9387. ;*************************************************************************************
  9388.  
  9389. _MLineShapeShortest2
  9390.   MOVEQ.l #0,d2 ; Init
  9391.   MOVE.b  CurrentInk1,d2 ; Colour to use
  9392. _MLineShapeShortest
  9393.   MOVE.w  d2,d4
  9394.   MOVE.w  d1,d3 ; Xpos2
  9395.   MOVE.w  d0,d2 ; Ypos2
  9396.   MOVE.w  LineLastXpos,d0
  9397.   MOVE.w  LineLastYpos,d1
  9398.   BRA     _MLine
  9399. _MLineShapeShort
  9400.   MOVEQ.l #0,d4 ; Init
  9401.   MOVE.b  CurrentInk1,d4 ; Colour to use
  9402. _MLineShape
  9403. ;Draw a line to a Shape from X1,Y1 to X2,Y2 in the specified colour or ink
  9404.   MOVE.w  d2,LineLastXpos
  9405.   MOVE.w  d3,LineLastYpos
  9406.   MOVE.w  d0,d5 ; X1 store
  9407.   MOVE.w  CurrentChunkyShape1,d0 ; Shape to draw to
  9408.   !GetShapeObjectPtr ; Base in a0
  9409.   MOVE.w  d5,d0 ; X1 restore
  9410.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Base of data
  9411.   JMP     PerformLine ; ignore rts
  9412.   RTS     ; Precaution
  9413.  
  9414. ;*************************************************************************************
  9415.  
  9416. _MLineStencilShortest2
  9417.   MOVEQ.l #0,d2 ; Init
  9418.   MOVE.b  CurrentInk1,d2 ; Colour to use
  9419. _MLineStencilShortest
  9420.   MOVE.w  d2,d4
  9421.   MOVE.w  d1,d3 ; Xpos2
  9422.   MOVE.w  d0,d2 ; Ypos2
  9423.   MOVE.w  LineLastXpos,d0
  9424.   MOVE.w  LineLastYpos,d1
  9425.   BRA     _MLine
  9426. _MLineStencilShort
  9427.   MOVEQ.l #0,d4 ; Init
  9428.   MOVE.b  CurrentInk1,d4 ; Colour to use
  9429. _MLineStencil
  9430. ;Draw a line to a Bitmap's stencil from X1,Y1 to X2,Y2 in the specified colour or ink
  9431.   MOVE.w  d2,LineLastXpos
  9432.   MOVE.w  d3,LineLastYpos
  9433.   MOVE.w  d0,d5 ; X1 store
  9434.   MOVE.w  CurrentChunkyBitmap1,d0 ; Bitmap to draw to
  9435.   !GetBitmapObjectPtr ; Base in a0
  9436.   MOVE.w  d5,d0 ; X1 restore
  9437.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a1 ; Base of stencil data
  9438.   TST.b   d4
  9439.   SEQ     d4 ; Make mask colour value
  9440.   MOVE.w  _DrawingModeType,d7
  9441.   CMP.b   #4,d7
  9442.   BLE     _MLineStencilSkip
  9443.   MOVE.w  d7,-(a7) ; Store
  9444.   MOVE.w  #4,_DrawingModeType ; Default to MColourMode instead of remapping
  9445.   JSR     PerformLine
  9446.   MOVE.w  (a7)+,_DrawingModeType ; Restore
  9447.   RTS
  9448. _MLineStencilSkip
  9449.   JMP     PerformLine ; ignore rts
  9450.   RTS     ; Precaution
  9451.  
  9452. ;*************************************************************************************
  9453.  
  9454. _MLineCookieShortest2
  9455.   MOVEQ.l #0,d2 ; Init
  9456.   MOVE.b  CurrentInk1,d2 ; Colour to use
  9457. _MLineCookieShortest
  9458.   MOVE.w  d2,d4
  9459.   MOVE.w  d1,d3 ; Xpos2
  9460.   MOVE.w  d0,d2 ; Ypos2
  9461.   MOVE.w  LineLastXpos,d0
  9462.   MOVE.w  LineLastYpos,d1
  9463.   BRA     _MLine
  9464. _MLineCookieShort
  9465.   MOVEQ.l #0,d4 ; Init
  9466.   MOVE.b  CurrentInk1,d4 ; Colour to use
  9467. _MLineCookie
  9468. ;Draw a line to a Shape's cookie from X1,Y1 to X2,Y2 in the specified colour or ink
  9469.   MOVE.w  d2,LineLastXpos
  9470.   MOVE.w  d3,LineLastYpos
  9471.   MOVE.w  d0,d5 ; X1 store
  9472.   MOVE.w  CurrentChunkyShape1,d0 ; Shape to draw to
  9473.   !GetShapeObjectPtr ; Base in a0
  9474.   MOVE.w  d5,d0 ; X1 restore
  9475.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a1 ; Base of cookie data
  9476.   TST.b   d4
  9477.   SEQ     d4 ; Make mask colour value
  9478.   MOVE.w  _DrawingModeType,d7
  9479.   CMP.b   #4,d7
  9480.   BLE     _MLineCookieSkip
  9481.   MOVE.w  d7,-(a7) ; Store
  9482.   MOVE.w  #4,_DrawingModeType ; Default to MColourMode instead of remapping
  9483.   JSR     PerformLine
  9484.   MOVE.w  (a7)+,_DrawingModeType ; Restore
  9485.   RTS
  9486. _MLineCookieSkip
  9487.   JMP     PerformLine ; ignore rts
  9488.   RTS     ; Precaution
  9489.  
  9490. ;*************************************************************************************
  9491.  
  9492. _MInkShortest
  9493.   MOVE.b  d2,CurrentInk3 ; set third colour
  9494. _MInkShort
  9495.   MOVE.b  d1,CurrentInk2 ; set second colour
  9496. _MInk
  9497. ;Sets a colour that can be assumed as the currently-used colour by various grapics routines when a colour is not specified
  9498.   MOVE.b  d0,CurrentInk1 ; set main colour
  9499.   RTS
  9500.  
  9501. ;*************************************************************************************
  9502.  
  9503. _MColourMode
  9504. ;Return value 4 to represent `colour' mode for blits
  9505.   MOVEQ.l #4,d0
  9506.   RTS
  9507.  
  9508. ;*************************************************************************************
  9509.  
  9510. _MReserveTables
  9511. _MReserveChunkyTables
  9512. ;Reserve memory for ChunkyTable structures
  9513.   MOVE.l  d0,d7
  9514.   TST.l   ChunkyTablesMem ; Check for existing mem allocated
  9515.   BEQ     ReserveChunkyTskip ; If exists, deallocate
  9516.   MOVE.w  ChunkyTablesTotal,d0
  9517.   EXT.l   d0
  9518.   LSL.l   #ChunkyTableStructSize,d0
  9519.   MOVE.l  ChunkyTablesMem,a1
  9520.   ALibJsr #BlitzFreemem ; Free memory
  9521.   MOVE.l  d7,d0
  9522.   MOVE.w  #0,ChunkyTablesTotal
  9523.   MOVE.l  #0,ChunkyTablesMem
  9524. ReserveChunkyTskip
  9525.   AND.l   #$FFFF,d0
  9526.   MOVE.w  d0,d7
  9527.   LSL.l   #ChunkyTableStructSize,d0
  9528.   MOVE.l  #ClearPublicMem,d1 ; MemType (public and clear)
  9529.   !CheckAvailMem{005}
  9530.   TST.b   d2 ; Likely?
  9531.   BEQ     ReserveChunkyTfailed
  9532.   ALibJsr #BlitzAllocmem ; Allocate memory
  9533.   TST.l   d0
  9534.   BEQ     ReserveChunkyTfailed
  9535.   MOVE.l  d0,ChunkyTablesMem
  9536.   MOVE.w  d7,ChunkyTablesTotal
  9537.   RTS     ; Return memory address in d0.l
  9538. ReserveChunkyTfailed
  9539.   MOVEQ.l #0,d0 ; Errorcode
  9540.   RTS
  9541.  
  9542. ;*************************************************************************************
  9543.  
  9544. _MFreeChunkyTablesRange
  9545. ;Free a range of ChunkyTable objects
  9546.   SUB.w   d0,d1 ; Total
  9547.   MOVE.w  d1,d7 ; Loopcounter, no need for -1
  9548.   MOVE.w  d0,d4 ; Start offset
  9549. FreeCTRloop
  9550.   MOVE.w  d7,d0
  9551.   ADD.w   d4,d0
  9552.   BSR     _MFreeChunkyTable ; Free it
  9553.   DBRA    d7,FreeCTRloop
  9554.   RTS
  9555. _MFreeTables
  9556. _MFreeChunkyTables
  9557. ;Free all ChunkyTable objects
  9558.   MOVE.w  ChunkyTablesTotal,d7
  9559.   SUBQ.w  #1,d7 ; loopcounter
  9560. FreeCTloop
  9561.   MOVE.w  d7,d0
  9562.   BSR     _MFreeChunkyTable ; Free it
  9563.   DBRA    d7,FreeCTloop
  9564. FreeCTsSkip
  9565.   RTS
  9566. _MFreeTable
  9567. _MFreeChunkyTable
  9568. ;Free a single ChunkyTable object
  9569.   !GetTableObjectPtr ; Get base of struct in a0
  9570. _MFreeChunkyTableEntry
  9571.   MOVE.l  d0,-(a7) ; Store
  9572.   TST.l   CTable_LMem-ChunkyResources(a0) ; List memory exist?
  9573.   BEQ     FreeTNoList
  9574.   MOVE.l  CTable_LBytes-ChunkyTables(a0),d0 ; Size
  9575.   MOVE.l  CTable_LMem-ChunkyTables(a0),a1 ; Mem address
  9576.   ALibJsr #BlitzFreemem ; Free data memory
  9577. FreeTNoList
  9578.   MOVE.l  #0,CTable_LMem-ChunkyTables(a0) ; Wipe LMem to indicate dead structure
  9579.   MOVE.l  (a7)+,d0 ; Restore
  9580.   RTS
  9581.  
  9582. ;*************************************************************************************
  9583.  
  9584. _MAddrChunkyTableShort
  9585.   MOVE.w  CurrentChunkyTable1,d0
  9586. _MAddrTable
  9587. _MAddrChunkyTable
  9588. ;Returns the address of the specified ChunkyTable structure
  9589.   !GetTableObjectPtr ; In a0
  9590.   MOVE.l  a0,d0 ; Return address
  9591.   RTS
  9592.  
  9593. ;*************************************************************************************
  9594.  
  9595. _MTable
  9596. _MChunkyTable
  9597. ;Initialise a new ChunkyTable object
  9598.   !GetTableObjectPtr ; Get base of struct
  9599.   MOVE.l  a0,a2 ; Store base pointer
  9600.   MOVE.w  d0,d7 ; Store
  9601.   MOVE.l  d1,d0
  9602.   TST.l   CTable_LMem-ChunkyQueues(a0) ; Has mem?
  9603.   BEQ     _MChunkyTSkip
  9604.   BSR     _MFreeChunkyTableEntry ; Deallocate existing data
  9605. _MChunkyTSkip
  9606.   MOVE.l  #0,CTable_Items-ChunkyTables(a0) ; Number of actual items
  9607.   MOVE.l  d0,CTable_LBytes-ChunkyTables(a0) ; Total number of byte items
  9608.   !NewChunkyMem{008} ; Returns address in d0
  9609.   MOVE.l  a2,a0
  9610.   TST.b   d2
  9611.   BEQ     _MChunkyTFailed
  9612.   MOVE.l  d0,CTable_LMem-ChunkyTables(a0)
  9613.   MOVE.l  d0,CTable_ItemAddr-ChunkyTables(a0) ; Address of current item
  9614.   TST.b   AutoChunkyTablesUse ; Use it?
  9615.   BEQ     _MChunkyTDontUse ; No
  9616.   MOVE.w  d7,CurrentChunkyTable1 ; Yes, store queue number in current
  9617. _MChunkyTDontUse
  9618.   RTS     ; Successful, return
  9619.  
  9620. _MChunkyTFailed
  9621.   MOVEQ.l #0,d0
  9622.   MOVE.l  #0,CTable_LMem-ChunkyTables(a0)
  9623.   RTS     ; Return errorcode in d0
  9624.  
  9625. ;*************************************************************************************
  9626.  
  9627. _MAutoUseTables
  9628. _MAutoUseChunkyTables
  9629.   MOVE.b  d0,AutoChunkyTablesUse
  9630.   RTS
  9631.  
  9632. ;*************************************************************************************
  9633.  
  9634. _MUseTable
  9635. _MUseChunkyTable
  9636. ;Set the currently used ChunkyTables
  9637.   MOVE.w  d2,CurrentChunkyTable3
  9638. _MUseChunkyTableShort
  9639.   MOVE.w  d1,CurrentChunkyTable2
  9640. _MUseChunkyTableShortest
  9641.   MOVE.w  d0,CurrentChunkyTable1
  9642.   RTS
  9643.  
  9644. ;*************************************************************************************
  9645.  
  9646. _MUsedTable
  9647. _MUsedChunkyTable
  9648. ;Returns number of main currently used ChunkyTable, or likely -1 if not defined
  9649.   MOVE.w  CurrentChunkyTable1,d0
  9650.   RTS
  9651.  
  9652. ;*************************************************************************************
  9653.  
  9654. _MTablePtrShort
  9655.   MOVE.w  CurrentChunkyTable1,d0 ; current object
  9656. _MTablePtr
  9657. ;Return the address of the base of the table data
  9658.   !GetTableObjectPtr ; Base in a0
  9659.   MOVE.l  CTable_LMem-ChunkyTables(a0),d0 ; Return base address
  9660.   RTS
  9661.  
  9662. ;*************************************************************************************
  9663.  
  9664. _MReMapMode
  9665. ;Return value 5 to represent `ReMap' mode for blits (to use current 2-dimensional 8-bit table)
  9666.   MOVEQ.l #5,d0
  9667.   RTS
  9668.  
  9669. ;*************************************************************************************
  9670.  
  9671. _MSimpleReMapMode
  9672. ;Return value 6 to represent `SimpleReMap' mode for blits (to use current 1-dimensional 8-bit table)
  9673.   MOVEQ.l #6,d0
  9674.   RTS
  9675.  
  9676. ;*************************************************************************************
  9677.  
  9678. _MSMaskScrollModeShort
  9679.   MOVE.w  SMaskScrollModeType,d0
  9680.   EXT.l   d0 ; Return current mode in d0
  9681.   RTS
  9682. _MSMaskScrollMode
  9683. ;Set blit mode type for MSMaskScrolls
  9684.   CMP.w   #8,d0 ; Direct?
  9685.   BGE     _MSMaskScrollModeJump
  9686.   MOVE.w  d0,SMaskScrollModeType ; Directly copy type number
  9687.   RTS
  9688. _MSMaskScrollModeJump
  9689.   CMP.w   #_CookieMode,d0 ; CookieMode?
  9690.   BNE     _MSMaskScrollModeSkip
  9691.   MOVE.w  #0,SMaskScrollModeType ; Store type for CookieMode
  9692.   RTS
  9693. _MSMaskScrollModeSkip
  9694.   CMP.w   #_EraseMode,d0 ; EraseMode?
  9695.   BNE     _MSMaskScrollModeSkip2
  9696.   MOVE.w  #1,SMaskScrollModeType ; Store type for EraseMode
  9697.   RTS
  9698. _MSMaskScrollModeSkip2
  9699.   CMP.w   #_InvMode,d0 ; InvMode?
  9700.   BNE     _MSMaskScrollModeSkip3
  9701.   MOVE.w  #2,SMaskScrollModeType ; Store type for InvMode
  9702.   RTS
  9703. _MSMaskScrollModeSkip3
  9704.   CMP.w   #_SolidMode,d0 ; SolidMode?
  9705.   BNE     _MSMaskScrollModeSkip4
  9706.   MOVE.w  #3,SMaskScrollModeType ; Store type for SolidMode
  9707.   RTS
  9708. _MSMaskScrollModeSkip4
  9709.   RTS
  9710.  
  9711. ;*************************************************************************************
  9712.  
  9713. _MPlotParticlesShort
  9714.   MOVEQ.l #0,d2 ; Init
  9715.   MOVE.b  CurrentInk1,d2 ; Colour to use
  9716. _MPlotParticles
  9717. ;Plot a list of pixels in a bitmap to specified or ink colour. List contains X.w,Y.w pairs
  9718.   TST.b   _ParticleFormat ; What format?
  9719.   BLT     _MPlotParticlesQ ; Data is in X.q,Y.q format
  9720.   BGT     _MPlotParticlesA ; Data is in Ptr.l format
  9721.   ;Data is in X.w,Y.w format
  9722.   CMP.w   #5,_ParticleModeType
  9723.   BEQ     _MPlotParticlesReMap
  9724.   CMP.w   #6,_ParticleModeType
  9725.   BEQ     _MPlotParticlesReMap
  9726.   MOVE.l  d0,a2 ; a2=List memory
  9727.   MOVE.w  CurrentChunkyBitmap1,d0 ; Bitmap to plot in
  9728.   !GetBitmapObjectPtr ; Base in a0
  9729.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Data mem
  9730.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  9731.   BEQ     _MPlotParticlesSkip
  9732.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1
  9733. _MPlotParticlesSkip
  9734.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d7 ; Total bytes width
  9735.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  9736.   BNE     _MPlotParticlesClip
  9737.   MOVE.l  a1,d5 ; Store data mem
  9738.   CMP.w   #7,_ParticleModeType
  9739.   BEQ     _MPlotParticlesAddLoop
  9740. _MPlotParticlesLoop
  9741.     MOVE.l  d5,a1 ; Reset base address of dest
  9742.     ADD.w   (a2)+,a1 ; Get x
  9743.     MOVE.w  (a2)+,d0 ; Get y
  9744.     MULU    d7,d0 ; Find y bytes
  9745.     ADD.l   d0,a1
  9746.     MOVE.b  d2,(a1) ; Plot point
  9747.     SUBQ.l  #1,d1 ; Next pixel
  9748.     BGT     _MPlotParticlesLoop
  9749.   RTS;pop
  9750. _MPlotParticlesAddLoop
  9751.     MOVE.l  d5,a1 ; Reset base address of dest
  9752.     ADD.w   (a2)+,a1 ; Get x
  9753.     MOVE.w  (a2)+,d0 ; Get y
  9754.     MULU    d7,d0 ; Find y bytes
  9755.     ADD.l   d0,a1
  9756.     ADD.b   d2,(a1) ; Plot Add
  9757.     SUBQ.l  #1,d1 ; Next pixel
  9758.     BGT     _MPlotParticlesAddLoop
  9759.   RTS;pop
  9760. _MPlotParticlesClip
  9761. ;Only plot the particles that are within the clip window
  9762.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  9763.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  9764.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  9765.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  9766.   ADD.w   d3,d5 ; X2 outside of window
  9767.   ADD.w   d4,d6 ; Y2 outside of window
  9768.   MOVE.l  a3,-(a7) ; Store
  9769.   MOVE.l  a1,a3 ; Store data mem
  9770.   CMP.w   #7,_ParticleModeType
  9771.   BEQ     _MPlotParticlesAddClipLoop
  9772. _MPlotParticlesClipLoop
  9773.     MOVE.l  a3,a1 ; Reset base address of dest
  9774.     MOVE.w  (a2)+,d0 ; Get x
  9775.     CMP.w   d3,d0 ; X<X1?
  9776.     BLT     _MPlotParticlesClipSkip
  9777.     CMP.w   d5,d0 ; X>=X2?
  9778.     BGE     _MPlotParticlesClipSkip
  9779.     ADD.w   d0,a1 ; Find x
  9780.     MOVE.w  (a2)+,d0 ; Get y
  9781.     CMP.w   d4,d0 ; Y<Y1?
  9782.     BLT     _MPlotParticlesClipSkip2
  9783.     CMP.w   d6,d0 ; Y>=Y2?
  9784.     BGE     _MPlotParticlesClipSkip2
  9785.     MULU    d7,d0 ; Find y bytes
  9786.     ADD.l   d0,a1
  9787.     MOVE.b  d2,(a1) ; Plot point
  9788. _MPlotParticlesClipSkip2
  9789.     SUBQ.l  #1,d1 ; Next pixel
  9790.     BGT     _MPlotParticlesClipLoop
  9791.   MOVE.l  (a7)+,a3
  9792.   RTS;pop
  9793. _MPlotParticlesClipSkip
  9794.     ADD.w   #2,a2 ; Mimic read
  9795.     SUBQ.l  #1,d1 ; Next pixel
  9796.     BGT     _MPlotParticlesClipLoop
  9797.   MOVE.l  (a7)+,a3
  9798.   RTS;pop
  9799. _MPlotParticlesAddClipLoop
  9800.     MOVE.l  a3,a1 ; Reset base address of dest
  9801.     MOVE.w  (a2)+,d0 ; Get x
  9802.     CMP.w   d3,d0 ; X<X1?
  9803.     BLT     _MPlotParticlesAddClipSkip
  9804.     CMP.w   d5,d0 ; X>=X2?
  9805.     BGE     _MPlotParticlesAddClipSkip
  9806.     ADD.w   d0,a1 ; Find x
  9807.     MOVE.w  (a2)+,d0 ; Get y
  9808.     CMP.w   d4,d0 ; Y<Y1?
  9809.     BLT     _MPlotParticlesAddClipSkip2
  9810.     CMP.w   d6,d0 ; Y>=Y2?
  9811.     BGE     _MPlotParticlesAddClipSkip2
  9812.     MULU    d7,d0 ; Find y bytes
  9813.     ADD.l   d0,a1
  9814.     ADD.b   d2,(a1) ; Plot Add
  9815. _MPlotParticlesAddClipSkip2
  9816.     SUBQ.l  #1,d1 ; Next pixel
  9817.     BGT     _MPlotParticlesAddClipLoop
  9818.   MOVE.l  (a7)+,a3
  9819.   RTS;pop
  9820. _MPlotParticlesAddClipSkip
  9821.     ADD.w   #2,a2 ; Mimic read
  9822.     SUBQ.l  #1,d1 ; Next pixel
  9823.     BGT     _MPlotParticlesAddClipLoop
  9824.   MOVE.l  (a7)+,a3
  9825.   RTS;pop
  9826. _MPlotParticlesReMap
  9827. ;Remap a list of X.w,Y.w particles in a bitmap, perhaps combining with specified colour. List contains X.w,Y.w pairs
  9828.   MOVE.l  a3,-(a7) ; Store
  9829.   MOVE.l  d0,a2 ; a2=List memory
  9830.   MOVE.w  CurrentChunkyTable1,d0 ; Table to use
  9831.   !GetTableObjectPtr ; Base in a0
  9832.   MOVE.l  CTable_LMem-ChunkyTables(a0),a3 ; a3=Table base
  9833.   MOVE.w  CurrentChunkyBitmap1,d0 ; Bitmap to plot in
  9834.   !GetBitmapObjectPtr ; Base in a0
  9835.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Data mem
  9836.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  9837.   BEQ     _MPlotParticlesReMapSkip
  9838.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1
  9839. _MPlotParticlesReMapSkip
  9840.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d7 ; Total bytes width
  9841.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  9842.   BNE     _MPlotParticlesReMapClip
  9843.   MOVE.l  a1,d5 ; Store data mem
  9844.   CMP.w   #5,_ParticleModeType ; Simple or complex?
  9845.   BEQ     _MPlotParticlesReMapComplex
  9846.   MOVEQ.l #0,d2 ; Init
  9847. _MPlotParticlesReMapLoop
  9848.     MOVE.l  d5,a1 ; Reset base address of dest
  9849.     ADD.w   (a2)+,a1 ; Get x
  9850.     MOVE.w  (a2)+,d0 ; Get y
  9851.     MULU    d7,d0 ; Find y bytes
  9852.     ADD.l   d0,a1
  9853.     MOVE.b  (a1),d2 ; Get point
  9854.     MOVE.b  0(a3,d2.w),(a1) ; Plot SimpleReMap
  9855.     SUBQ.l  #1,d1 ; Next pixel
  9856.     BGT     _MPlotParticlesReMapLoop
  9857.   MOVE.l  (a7)+,a3 ; Restore
  9858.   RTS;pop
  9859. _MPlotParticlesReMapComplex
  9860.   LSL.w   #8,d2 ; Make upper portion of offset
  9861.   AND.l   #$0000FF00,d2
  9862. _MPlotParticlesReMapComplexLoop
  9863.     MOVE.l  d5,a1 ; Reset base address of dest
  9864.     ADD.w   (a2)+,a1 ; Get x
  9865.     MOVE.w  (a2)+,d0 ; Get y
  9866.     MULU    d7,d0 ; Find y bytes
  9867.     ADD.l   d0,a1
  9868.     MOVE.b  (a1),d2 ; Get point
  9869.     MOVE.b  0(a3,d2.l),(a1) ; Plot ReMap
  9870.     SUBQ.l  #1,d1 ; Next pixel
  9871.     BGT     _MPlotParticlesReMapComplexLoop
  9872.   MOVE.l  (a7)+,a3 ; Restore
  9873.   RTS;pop
  9874. _MPlotParticlesReMapClip
  9875. ;Only remap the particles that are within the clip window
  9876.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  9877.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  9878.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  9879.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  9880.   ADD.w   d3,d5 ; X2 outside of window
  9881.   ADD.w   d4,d6 ; Y2 outside of window
  9882.   MOVE.l  a4,-(a7) ; Store
  9883.   MOVE.l  a1,a4 ; Store data mem
  9884.   CMP.w   #5,_ParticleModeType ; Simple or complex?
  9885.   BEQ     _MPlotParticlesReMapClipComplex
  9886.   MOVEQ.l #0,d2 ; Init
  9887. _MPlotParticlesReMapClipLoop
  9888.     MOVE.l  a4,a1 ; Reset base address of dest
  9889.     MOVE.w  (a2)+,d0 ; Get x
  9890.     CMP.w   d3,d0 ; X<X1?
  9891.     BLT     _MPlotParticlesReMapClipSkip
  9892.     CMP.w   d5,d0 ; X>=X2?
  9893.     BGE     _MPlotParticlesReMapClipSkip
  9894.     ADD.w   d0,a1 ; Find x
  9895.     MOVE.w  (a2)+,d0 ; Get y
  9896.     CMP.w   d4,d0 ; Y<Y1?
  9897.     BLT     _MPlotParticlesReMapClipSkip2
  9898.     CMP.w   d6,d0 ; Y>=Y2?
  9899.     BGE     _MPlotParticlesReMapClipSkip2
  9900.     MULU    d7,d0 ; Find y bytes
  9901.     ADD.l   d0,a1
  9902.     MOVE.b  (a1),d2 ; Get point
  9903.     MOVE.b  0(a3,d2.w),(a1) ; Plot SimpleReMap
  9904. _MPlotParticlesReMapClipSkip2
  9905.     SUBQ.l  #1,d1 ; Next pixel
  9906.     BGT     _MPlotParticlesReMapClipLoop
  9907.   MOVE.l  (a7)+,a4
  9908.   MOVE.l  (a7)+,a3
  9909.   RTS;pop
  9910. _MPlotParticlesReMapClipSkip
  9911.     ADD.w   #2,a2 ; Mimic read
  9912.     SUBQ.l  #1,d1 ; Next pixel
  9913.     BGT     _MPlotParticlesReMapClipLoop
  9914.   MOVE.l  (a7)+,a4
  9915.   MOVE.l  (a7)+,a3
  9916.   RTS;pop
  9917. _MPlotParticlesReMapClipComplex
  9918.   LSL.w   #8,d2 ; Make upper portion of offset
  9919.   AND.l   #$0000FF00,d2
  9920. _MPlotParticlesReMapClipComplexLoop
  9921.     MOVE.l  a4,a1 ; Reset base address of dest
  9922.     MOVE.w  (a2)+,d0 ; Get x
  9923.     CMP.w   d3,d0 ; X<X1?
  9924.     BLT     _MPlotParticlesReMapClipComplexSkip
  9925.     CMP.w   d5,d0 ; X>=X2?
  9926.     BGE     _MPlotParticlesReMapClipComplexSkip
  9927.     ADD.w   d0,a1 ; Find x
  9928.     MOVE.w  (a2)+,d0 ; Get y
  9929.     CMP.w   d4,d0 ; Y<Y1?
  9930.     BLT     _MPlotParticlesReMapClipComplexSkip2
  9931.     CMP.w   d6,d0 ; Y>=Y2?
  9932.     BGE     _MPlotParticlesReMapClipComplexSkip2
  9933.     MULU    d7,d0 ; Find y bytes
  9934.     ADD.l   d0,a1
  9935.     MOVE.b  (a1),d2 ; Get point
  9936.     MOVE.b  0(a3,d2.l),(a1) ; Plot ReMap
  9937. _MPlotParticlesReMapClipComplexSkip2
  9938.     SUBQ.l  #1,d1 ; Next pixel
  9939.     BGT     _MPlotParticlesReMapClipComplexLoop
  9940.   MOVE.l  (a7)+,a4
  9941.   MOVE.l  (a7)+,a3
  9942.   RTS;pop
  9943. _MPlotParticlesReMapClipComplexSkip
  9944.     ADD.w   #2,a2 ; Mimic read
  9945.     SUBQ.l  #1,d1 ; Next pixel
  9946.     BGT     _MPlotParticlesReMapClipComplexLoop
  9947.   MOVE.l  (a7)+,a4
  9948.   MOVE.l  (a7)+,a3
  9949.   RTS
  9950.  
  9951. _MPlotParticlesA
  9952. ;Plot a list of pixels in a bitmap to specified or ink colour. List contains Ptr.l actual addresses (not coords or clipping)
  9953.   CMP.w   #5,_ParticleModeType
  9954.   BEQ     _MPlotParticlesAReMap
  9955.   CMP.w   #6,_ParticleModeType
  9956.   BEQ     _MPlotParticlesAReMap
  9957.   MOVE.l  d0,a2 ; a2=List memory
  9958.   CMP.w   #7,_ParticleModeType
  9959.   BEQ     _MPlotParticlesAAddLoop
  9960. _MPlotParticlesALoop
  9961.     MOVE.l  (a2)+,a1 ; Get address
  9962.     MOVE.b  d2,(a1) ; Plot point
  9963.     SUBQ.l  #1,d1 ; Next pixel
  9964.     BGT     _MPlotParticlesALoop
  9965.   RTS;pop
  9966. _MPlotParticlesAAddLoop
  9967.     MOVE.l  (a2)+,a1 ; Get address
  9968.     ADD.b   d2,(a1) ; Plot Add
  9969.     SUBQ.l  #1,d1 ; Next pixel
  9970.     BGT     _MPlotParticlesAAddLoop
  9971.   RTS;pop
  9972. _MPlotParticlesAReMap
  9973. ;Remap a list of Ptr.l particles in a bitmap, perhaps combining with specified colour. List contains Ptr.l actual addresses
  9974.   MOVE.l  d0,a2 ; a2=List memory
  9975.   MOVE.w  CurrentChunkyTable1,d0 ; Table to use
  9976.   !GetTableObjectPtr ; Base in a0
  9977.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0 ; a0=Table base
  9978.   CMP.w   #5,_ParticleModeType ; Simple or complex?
  9979.   BEQ     _MPlotParticlesAReMapComplex
  9980.   MOVEQ.l #0,d2 ; Init
  9981. _MPlotParticlesAReMapLoop
  9982.     MOVE.l  (a2)+,a1 ; Get Ptr.l
  9983.     MOVE.b  (a1),d2 ; Get point
  9984.     MOVE.b  0(a0,d2.w),(a1) ; Plot SimpleReMap
  9985.     SUBQ.l  #1,d1 ; Next pixel
  9986.     BGT     _MPlotParticlesAReMapLoop
  9987.   RTS;pop
  9988. _MPlotParticlesAReMapComplex
  9989.   LSL.w   #8,d2 ; Make upper portion of offset
  9990.   AND.l   #$0000FF00,d2
  9991. _MPlotParticlesAReMapComplexLoop
  9992.     MOVE.l  (a2)+,a1 ; Get Ptr.l
  9993.     MOVE.b  (a1),d2 ; Get point
  9994.     MOVE.b  0(a0,d2.l),(a1) ; Plot ReMap
  9995.     SUBQ.l  #1,d1 ; Next pixel
  9996.     BGT     _MPlotParticlesAReMapComplexLoop
  9997.   RTS
  9998.  
  9999. _MPlotParticlesQ
  10000. ;Plot a list of pixels in a bitmap to specified or ink colour. List contains X.q,Y.q pairs
  10001.   CMP.w   #5,_ParticleModeType
  10002.   BEQ     _MPlotParticlesQReMap
  10003.   CMP.w   #6,_ParticleModeType
  10004.   BEQ     _MPlotParticlesQReMap
  10005.   MOVE.l  d0,a2 ; a2=List memory
  10006.   MOVE.w  CurrentChunkyBitmap1,d0 ; Bitmap to plot in
  10007.   !GetBitmapObjectPtr ; Base in a0
  10008.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Data mem
  10009.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  10010.   BEQ     _MPlotParticlesQSkip
  10011.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1
  10012. _MPlotParticlesQSkip
  10013.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d7 ; Total bytes width
  10014.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  10015.   BNE     _MPlotParticlesQClip
  10016.   MOVE.l  a1,d5 ; Store data mem
  10017.   CMP.w   #7,_ParticleModeType
  10018.   BEQ     _MPlotParticlesQAddLoop
  10019. _MPlotParticlesQLoop
  10020.     MOVE.l  d5,a1 ; Reset base address of dest
  10021.     MOVE.w  4(a2),d0 ; Get y from top word of .q
  10022.     MULU    d7,d0 ; Find y bytes
  10023.     ADD.w   (a2),a1 ; Get x from top word of .q
  10024.     ADD.l   d0,a1
  10025.     ADD.w   #8,a2 ; Next pair of .q items
  10026.     MOVE.b  d2,(a1) ; Plot point
  10027.     SUBQ.l  #1,d1 ; Next pixel
  10028.     BGT     _MPlotParticlesQLoop
  10029.   RTS;pop
  10030. _MPlotParticlesQAddLoop
  10031.     MOVE.l  d5,a1 ; Reset base address of dest
  10032.     MOVE.w  4(a2),d0 ; Get y from top word of .q
  10033.     MULU    d7,d0 ; Find y bytes
  10034.     ADD.w   (a2),a1 ; Get x from top word of .q
  10035.     ADD.l   d0,a1
  10036.     ADD.w   #8,a2 ; Next pair of .q items
  10037.     ADD.b   d2,(a1) ; Plot Add
  10038.     SUBQ.l  #1,d1 ; Next pixel
  10039.     BGT     _MPlotParticlesQAddLoop
  10040.   RTS;pop
  10041. _MPlotParticlesQClip
  10042. ;Only plot the particles that are within the clip window
  10043.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  10044.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  10045.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  10046.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  10047.   ADD.w   d3,d5 ; X2 outside of window
  10048.   ADD.w   d4,d6 ; Y2 outside of window
  10049.   MOVE.l  a3,-(a7) ; Store
  10050.   MOVE.l  a1,a3 ; Store data mem
  10051.   CMP.w   #7,_ParticleModeType
  10052.   BEQ     _MPlotParticlesQAddClipLoop
  10053. _MPlotParticlesQClipLoop
  10054.     MOVE.l  a3,a1 ; Reset base address of dest
  10055.     MOVE.w  (a2),d0 ; Get x from top word of .q
  10056.     CMP.w   d3,d0 ; X<X1?
  10057.     BLT     _MPlotParticlesQClipSkip
  10058.     CMP.w   d5,d0 ; X>=X2?
  10059.     BGE     _MPlotParticlesQClipSkip
  10060.     ADD.w   d0,a1 ; Find x
  10061.     MOVE.w  4(a2),d0 ; Get y from top word of .q
  10062.     CMP.w   d4,d0 ; Y<Y1?
  10063.     BLT     _MPlotParticlesQClipSkip
  10064.     CMP.w   d6,d0 ; Y>=Y2?
  10065.     BGE     _MPlotParticlesQClipSkip
  10066.     MULU    d7,d0 ; Find y bytes
  10067.     ADD.l   d0,a1
  10068.     MOVE.b  d2,(a1) ; Plot point
  10069. _MPlotParticlesQClipSkip
  10070.     ADD.w   #8,a2 ; Next pair of .q items
  10071.     SUBQ.l  #1,d1 ; Next pixel
  10072.     BGT     _MPlotParticlesQClipLoop
  10073.   MOVE.l  (a7)+,a3
  10074.   RTS;pop
  10075. _MPlotParticlesQAddClipLoop
  10076.     MOVE.l  a3,a1 ; Reset base address of dest
  10077.     MOVE.w  (a2),d0 ; Get x from top word of .q
  10078.     CMP.w   d3,d0 ; X<X1?
  10079.     BLT     _MPlotParticlesQAddClipSkip
  10080.     CMP.w   d5,d0 ; X>=X2?
  10081.     BGE     _MPlotParticlesQAddClipSkip
  10082.     ADD.w   d0,a1 ; Find x
  10083.     MOVE.w  4(a2),d0 ; Get y from top word of .q
  10084.     CMP.w   d4,d0 ; Y<Y1?
  10085.     BLT     _MPlotParticlesQAddClipSkip
  10086.     CMP.w   d6,d0 ; Y>=Y2?
  10087.     BGE     _MPlotParticlesQAddClipSkip
  10088.     MULU    d7,d0 ; Find y bytes
  10089.     ADD.l   d0,a1
  10090.     ADD.b   d2,(a1) ; Plot Add
  10091. _MPlotParticlesQAddClipSkip
  10092.     ADD.w   #8,a2 ; Next pair of .q items
  10093.     SUBQ.l  #1,d1 ; Next pixel
  10094.     BGT     _MPlotParticlesQAddClipLoop
  10095.   MOVE.l  (a7)+,a3
  10096.   RTS;pop
  10097. _MPlotParticlesQReMap
  10098. ;Remap a list of X.q,Y.q particles in a bitmap, perhaps combining with specified colour. List contains X.q,Y.q pairs
  10099.   MOVE.l  a3,-(a7) ; Store
  10100.   MOVE.l  d0,a2 ; a2=List memory
  10101.   MOVE.w  CurrentChunkyTable1,d0 ; Table to use
  10102.   !GetTableObjectPtr ; Base in a0
  10103.   MOVE.l  CTable_LMem-ChunkyTables(a0),a3 ; a3=Table base
  10104.   MOVE.w  CurrentChunkyBitmap1,d0 ; Bitmap to plot in
  10105.   !GetBitmapObjectPtr ; Base in a0
  10106.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Data mem
  10107.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  10108.   BEQ     _MPlotParticlesQReMapSkip
  10109.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1
  10110. _MPlotParticlesQReMapSkip
  10111.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d7 ; Total bytes width
  10112.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  10113.   BNE     _MPlotParticlesQReMapClip
  10114.   MOVE.l  a1,d5 ; Store data mem
  10115.   CMP.w   #5,_ParticleModeType ; Simple or complex?
  10116.   BEQ     _MPlotParticlesQReMapComplex
  10117.   MOVEQ.l #0,d2 ; Init
  10118. _MPlotParticlesQReMapLoop
  10119.     MOVE.l  d5,a1 ; Reset base address of dest
  10120.     ADD.w   (a2),a1 ; Get x from upper word of X.q
  10121.     MOVE.w  4(a2),d0 ; Get y from upper word of Y.q
  10122.     MULU    d7,d0 ; Find y bytes
  10123.     ADD.w   #8,a2 ; Next
  10124.     ADD.l   d0,a1
  10125.     MOVE.b  (a1),d2 ; Get point
  10126.     MOVE.b  0(a3,d2.w),(a1) ; Plot SimpleReMap
  10127.     SUBQ.l  #1,d1 ; Next pixel
  10128.     BGT     _MPlotParticlesQReMapLoop
  10129.   MOVE.l  (a7)+,a3 ; Restore
  10130.   RTS;pop
  10131. _MPlotParticlesQReMapComplex
  10132.   LSL.w   #8,d2 ; Make upper portion of offset
  10133.   AND.l   #$0000FF00,d2
  10134. _MPlotParticlesQReMapComplexLoop
  10135.     MOVE.l  d5,a1 ; Reset base address of dest
  10136.     ADD.w   (a2),a1 ; Get x from upper word of X.q
  10137.     MOVE.w  4(a2),d0 ; Get y from upper word of Y.q
  10138.     MULU    d7,d0 ; Find y bytes
  10139.     ADD.w   #8,a2 ; next
  10140.     ADD.l   d0,a1
  10141.     MOVE.b  (a1),d2 ; Get point
  10142.     MOVE.b  0(a3,d2.l),(a1) ; Plot ReMap
  10143.     SUBQ.l  #1,d1 ; Next pixel
  10144.     BGT     _MPlotParticlesQReMapComplexLoop
  10145.   MOVE.l  (a7)+,a3 ; Restore
  10146.   RTS;pop
  10147. _MPlotParticlesQReMapClip
  10148. ;Only remap the particles that are within the clip window
  10149.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  10150.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  10151.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  10152.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  10153.   ADD.w   d3,d5 ; X2 outside of window
  10154.   ADD.w   d4,d6 ; Y2 outside of window
  10155.   MOVE.l  a4,-(a7) ; Store
  10156.   MOVE.l  a1,a4 ; Store data mem
  10157.   CMP.w   #5,_ParticleModeType ; Simple or complex?
  10158.   BEQ     _MPlotParticlesQReMapClipComplex
  10159.   MOVEQ.l #0,d2 ; Init
  10160. _MPlotParticlesQReMapClipLoop
  10161.     MOVE.l  a4,a1 ; Reset base address of dest
  10162.     MOVE.w  (a2),d0 ; Get x from upper word of X.q
  10163.     CMP.w   d3,d0 ; X<X1?
  10164.     BLT     _MPlotParticlesQReMapClipSkip
  10165.     CMP.w   d5,d0 ; X>=X2?
  10166.     BGE     _MPlotParticlesQReMapClipSkip
  10167.     ADD.w   d0,a1 ; Find x
  10168.     MOVE.w  4(a2),d0 ; Get y from upper word of Y.q
  10169.     CMP.w   d4,d0 ; Y<Y1?
  10170.     BLT     _MPlotParticlesQReMapClipSkip2
  10171.     CMP.w   d6,d0 ; Y>=Y2?
  10172.     BGE     _MPlotParticlesQReMapClipSkip2
  10173.     MULU    d7,d0 ; Find y bytes
  10174.     ADD.l   d0,a1
  10175.     MOVE.b  (a1),d2 ; Get point
  10176.     MOVE.b  0(a3,d2.w),(a1) ; Plot SimpleReMap
  10177. _MPlotParticlesQReMapClipSkip2
  10178.     ADD.w   #8,a2 ; Next
  10179.     SUBQ.l  #1,d1 ; Next pixel
  10180.     BGT     _MPlotParticlesQReMapClipLoop
  10181.   MOVE.l  (a7)+,a4
  10182.   MOVE.l  (a7)+,a3
  10183.   RTS;pop
  10184. _MPlotParticlesQReMapClipSkip
  10185.     ADD.w   #8,a2 ; Mimic read
  10186.     SUBQ.l  #1,d1 ; Next pixel
  10187.     BGT     _MPlotParticlesReMapClipLoop
  10188.   MOVE.l  (a7)+,a4
  10189.   MOVE.l  (a7)+,a3
  10190.   RTS;pop
  10191. _MPlotParticlesQReMapClipComplex
  10192.   LSL.w   #8,d2 ; Make upper portion of offset
  10193.   AND.l   #$0000FF00,d2
  10194. _MPlotParticlesQReMapClipComplexLoop
  10195.     MOVE.l  a4,a1 ; Reset base address of dest
  10196.     MOVE.w  (a2),d0 ; Get x from upper word of X.q
  10197.     CMP.w   d3,d0 ; X<X1?
  10198.     BLT     _MPlotParticlesQReMapClipComplexSkip
  10199.     CMP.w   d5,d0 ; X>=X2?
  10200.     BGE     _MPlotParticlesQReMapClipComplexSkip
  10201.     ADD.w   d0,a1 ; Find x
  10202.     MOVE.w  4(a2),d0 ; Get y from upper word of Y.q
  10203.     CMP.w   d4,d0 ; Y<Y1?
  10204.     BLT     _MPlotParticlesQReMapClipComplexSkip2
  10205.     CMP.w   d6,d0 ; Y>=Y2?
  10206.     BGE     _MPlotParticlesQReMapClipComplexSkip2
  10207.     MULU    d7,d0 ; Find y bytes
  10208.     ADD.l   d0,a1
  10209.     MOVE.b  (a1),d2 ; Get point
  10210.     MOVE.b  0(a3,d2.l),(a1) ; Plot ReMap
  10211. _MPlotParticlesQReMapClipComplexSkip2
  10212.     ADD.w   #8,a2 ; Next
  10213.     SUBQ.l  #1,d1 ; Next pixel
  10214.     BGT     _MPlotParticlesQReMapClipComplexLoop
  10215.   MOVE.l  (a7)+,a4
  10216.   MOVE.l  (a7)+,a3
  10217.   RTS;pop
  10218. _MPlotParticlesQReMapClipComplexSkip
  10219.     ADD.w   #8,a2 ; Mimic read
  10220.     SUBQ.l  #1,d1 ; Next pixel
  10221.     BGT     _MPlotParticlesQReMapClipComplexLoop
  10222.   MOVE.l  (a7)+,a4
  10223.   MOVE.l  (a7)+,a3
  10224.   RTS
  10225.  
  10226. ;*************************************************************************************
  10227.  
  10228. _MGrabParticles
  10229. ;Grab a buffer of pixels from a bitmap using a list. List contains X.w,Y.w pairs, Buffer contains byte per pixel
  10230.   TST.b   _ParticleFormat ; What format?
  10231.   BLT     _MGrabParticlesQ ; Operation uses X.q,Y.q data
  10232.   BGT     _MGrabParticlesA ; Operation uses Ptr.l data
  10233.   ;Use X.w,Y.w data
  10234.   MOVE.l  d0,a2 ; a2=List memory
  10235.   MOVE.w  CurrentChunkyBitmap1,d0 ; Bitmap to plot in
  10236.   !GetBitmapObjectPtr ; Base in a0
  10237.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Data mem
  10238.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  10239.   BEQ     _MGrabParticlesSkip
  10240.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1
  10241. _MGrabParticlesSkip
  10242.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d7 ; Total bytes width
  10243.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  10244.   BNE     _MGrabParticlesClip
  10245.   MOVE.l  a1,d5 ; Store data mem
  10246.   MOVE.l  d2,a0 ; Buffer mem
  10247. _MGrabParticlesLoop
  10248.     MOVE.l  d5,a1 ; Reset base address of dest
  10249.     ADD.w   (a2)+,a1 ; Get x
  10250.     MOVE.w  (a2)+,d0 ; Get y
  10251.     MULU    d7,d0 ; Find y bytes
  10252.     ADD.l   d0,a1
  10253.     MOVE.b  (a1),(a0)+ ; Grab point
  10254.     SUBQ.l  #1,d1 ; Next pixel
  10255.     BGT     _MGrabParticlesLoop
  10256.   RTS;pop
  10257. _MGrabParticlesClip
  10258. ;Only update the grabs of particles that are within the clip window
  10259.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  10260.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  10261.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  10262.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  10263.   ADD.w   d3,d5 ; X2 outside of window
  10264.   ADD.w   d4,d6 ; Y2 outside of window
  10265.   MOVE.l  d2,a0 ; Buffer mem
  10266.   MOVE.l  a1,d2 ; Store data mem
  10267. _MGrabParticlesClipLoop
  10268.     MOVE.l  d2,a1 ; Reset base address of dest
  10269.     MOVE.w  (a2)+,d0 ; Get x
  10270.     CMP.w   d3,d0 ; X<X1?
  10271.     BLT     _MGrabParticlesClipSkip
  10272.     CMP.w   d5,d0 ; X>=X2?
  10273.     BGE     _MGrabParticlesClipSkip
  10274.     ADD.w   d0,a1 ; Find x
  10275.     MOVE.w  (a2)+,d0 ; Get y
  10276.     CMP.w   d4,d0 ; Y<Y1?
  10277.     BLT     _MGrabParticlesClipSkip2
  10278.     CMP.w   d6,d0 ; Y>=Y2?
  10279.     BGE     _MGrabParticlesClipSkip2
  10280.     MULU    d7,d0 ; Find y bytes
  10281.     ADD.l   d0,a1
  10282.     MOVE.b  (a1),(a0)+ ; Grab point
  10283.     SUBQ.l  #1,d1 ; Next pixel
  10284.     BGT     _MGrabParticlesClipLoop
  10285.   RTS;pop
  10286. _MGrabParticlesClipSkip
  10287.     ADD.w   #1,a0 ; Mimic write
  10288.     ADD.w   #2,a2 ; Mimic read
  10289.     SUBQ.l  #1,d1 ; Next pixel
  10290.     BGT     _MGrabParticlesClipLoop
  10291.   RTS;pop
  10292. _MGrabParticlesClipSkip2
  10293.     ADD.w   #1,a0 ; Minic write
  10294.     SUBQ.l  #1,d1 ; Next pixel
  10295.     BGT     _MGrabParticlesClipLoop
  10296.   RTS
  10297.  
  10298. _MGrabParticlesA
  10299. ;Grab a buffer of pixels from a bitmap using a list. List contains Ptr.l actual addresses, Buffer contains byte per pixel
  10300.   MOVE.l  d0,a2 ; a2=List memory
  10301.   MOVE.l  d2,a0 ; Buffer mem
  10302. _MGrabParticlesALoop
  10303.     MOVE.l  (a2)+,a1 ; Get address
  10304.     MOVE.b  (a1),(a0)+ ; Grab point
  10305.     SUBQ.l  #1,d1 ; Next pixel
  10306.     BGT     _MGrabParticlesALoop
  10307.   RTS
  10308.  
  10309. _MGrabParticlesQ
  10310. ;Grab a buffer of pixels from a bitmap using a list. List contains X.q,Y.q pairs, Buffer contains byte per pixel
  10311.   MOVE.l  d0,a2 ; a2=List memory
  10312.   MOVE.w  CurrentChunkyBitmap1,d0 ; Bitmap to plot in
  10313.   !GetBitmapObjectPtr ; Base in a0
  10314.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Data mem
  10315.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  10316.   BEQ     _MGrabParticlesQSkip
  10317.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1
  10318. _MGrabParticlesQSkip
  10319.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d7 ; Total bytes width
  10320.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  10321.   BNE     _MGrabParticlesQClip
  10322.   MOVE.l  a1,d5 ; Store data mem
  10323.   MOVE.l  d2,a0 ; Buffer mem
  10324. _MGrabParticlesQLoop
  10325.     MOVE.l  d5,a1 ; Reset base address of dest
  10326.     MOVE.w  4(a2),d0 ; Get y from top word of .q
  10327.     MULU    d7,d0 ; Find y bytes
  10328.     ADD.w   (a2),a1 ; Get x from top word of .q
  10329.     ADD.l   d0,a1
  10330.     ADD.w   #8,a2 ; Next pair of .q items
  10331.     MOVE.b  (a1),(a0)+ ; Grab point
  10332.     SUBQ.l  #1,d1 ; Next pixel
  10333.     BGT     _MGrabParticlesQLoop
  10334.   RTS;pop
  10335. _MGrabParticlesQClip
  10336. ;Only update the grabs of particles that are within the clip window
  10337.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  10338.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  10339.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  10340.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  10341.   ADD.w   d3,d5 ; X2 outside of window
  10342.   ADD.w   d4,d6 ; Y2 outside of window
  10343.   MOVE.l  d2,a0 ; Buffer mem
  10344.   MOVE.l  a1,d2 ; Store data mem
  10345. _MGrabParticlesQClipLoop
  10346.     MOVE.l  d2,a1 ; Reset base address of dest
  10347.     MOVE.w  (a2),d0 ; Get x from top word of .q
  10348.     CMP.w   d3,d0 ; X<X1?
  10349.     BLT     _MGrabParticlesQClipSkip
  10350.     CMP.w   d5,d0 ; X>=X2?
  10351.     BGE     _MGrabParticlesQClipSkip
  10352.     ADD.w   d0,a1 ; Find x
  10353.     MOVE.w  4(a2),d0 ; Get y from top word of .q
  10354.     CMP.w   d4,d0 ; Y<Y1?
  10355.     BLT     _MGrabParticlesQClipSkip
  10356.     CMP.w   d6,d0 ; Y>=Y2?
  10357.     BGE     _MGrabParticlesQClipSkip
  10358.     MULU    d7,d0 ; Find y bytes
  10359.     ADD.w   #8,a2 ; Next pair of .q items
  10360.     ADD.l   d0,a1
  10361.     MOVE.b  (a1),(a0)+ ; Grab point
  10362.     SUBQ.l  #1,d1 ; Next pixel
  10363.     BGT     _MGrabParticlesQClipLoop
  10364.   RTS;pop
  10365. _MGrabParticlesQClipSkip
  10366.     ADD.w   #1,a0 ; Mimic write
  10367.     ADD.w   #8,a2 ; Mimic read
  10368.     SUBQ.l  #1,d1 ; Next pixel
  10369.     BGT     _MGrabParticlesQClipLoop
  10370.   RTS
  10371.  
  10372. ;*************************************************************************************
  10373.  
  10374. _MDrawParticles
  10375. ;Draw a buffer of pixels to a bitmap using a list. List contains X.w,Y.w pairs, Buffer contains byte per pixel
  10376. ;Drawing is done backwards to facilitate a stack for proper background restore
  10377.   TST.b   _ParticleFormat ; What format?
  10378.   BLT     _MDrawParticlesQ ; Data is in X.q,Y.q format
  10379.   BGT     _MDrawParticlesA ; Data is in Ptr.l format
  10380.   ;Data is in X.w,Y.w format
  10381.   CMP.w   #5,_ParticleModeType
  10382.   BEQ     _MDrawParticlesReMap
  10383.   CMP.w   #6,_ParticleModeType
  10384.   BEQ     _MDrawParticlesReMap
  10385.   MOVE.l  d0,a2 ; a2=List memory
  10386.   MOVE.w  CurrentChunkyBitmap1,d0 ; Bitmap to plot in
  10387.   !GetBitmapObjectPtr ; Base in a0
  10388.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Data mem
  10389.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  10390.   BEQ     _MDrawParticlesSkip
  10391.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1
  10392. _MDrawParticlesSkip
  10393.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d7 ; Total bytes width
  10394.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  10395.   BNE     _MDrawParticlesClip
  10396.   MOVE.l  a1,d5 ; Store data mem
  10397.   MOVE.l  d2,a0 ; Buffer mem
  10398.   MOVE.l  d1,d0 ; Copy number of pixels
  10399.   LSL.l   #2,d0 ; *4 for offset - number of pixels should be no higher than 2 bits less than signed longword max
  10400.   ADD.l   d0,a2 ; Find end of table
  10401.   ADD.l   d1,a0 ; Find end of buffer
  10402.   CMP.w   #7,_ParticleModeType
  10403.   BEQ     _MDrawParticlesAddLoop
  10404. _MDrawParticlesLoop
  10405.     MOVE.l  d5,a1 ; Reset base address of dest
  10406.     MOVE.w  -(a2),d0 ; Get y
  10407.     MULU    d7,d0 ; Find y bytes
  10408.     ADD.l   d0,a1
  10409.     ADD.w   -(a2),a1 ; Get x
  10410.     MOVE.b  -(a0),(a1) ; Draw point
  10411.     SUBQ.l  #1,d1 ; Next pixel
  10412.     BGT     _MDrawParticlesLoop
  10413.   RTS;pop
  10414. _MDrawParticlesAddLoop
  10415.     MOVE.l  d5,a1 ; Reset base address of dest
  10416.     MOVE.w  -(a2),d0 ; Get y
  10417.     MULU    d7,d0 ; Find y bytes
  10418.     MOVE.b  -(a0),d2 ; Get point
  10419.     ADD.l   d0,a1
  10420.     ADD.w   -(a2),a1 ; Get x
  10421.     ADD.b   d2,(a1) ; Draw Add
  10422.     SUBQ.l  #1,d1 ; Next pixel
  10423.     BGT     _MDrawParticlesAddLoop
  10424.   RTS;pop
  10425. _MDrawParticlesClip
  10426. ;Only draw the grabbed particles that are within the clip window
  10427.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  10428.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  10429.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  10430.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  10431.   ADD.w   d3,d5 ; X2 outside of window
  10432.   ADD.w   d4,d6 ; Y2 outside of window
  10433.   MOVE.l  d2,a0 ; Buffer mem
  10434.   MOVE.l  a1,d2 ; Store data mem
  10435.   MOVE.l  d1,d0 ; Copy number of pixels
  10436.   LSL.l   #2,d0 ; *4 for offset
  10437.   ADD.l   d0,a2 ; Find end of table
  10438.   ADD.l   d1,a0 ; Find end of buffer
  10439.   CMP.w   #7,_ParticleModeType
  10440.   BEQ     _MDrawParticlesAddClipLoop
  10441. _MDrawParticlesClipLoop
  10442.     MOVE.l  d2,a1 ; Reset base address of dest
  10443.     MOVE.w  -(a2),d0 ; Get y
  10444.     CMP.w   d4,d0 ; Y<Y1?
  10445.     BLT     _MDrawParticlesClipSkip
  10446.     CMP.w   d6,d0 ; Y>=Y2?
  10447.     BGE     _MDrawParticlesClipSkip
  10448.     MULU    d7,d0 ; Find y bytes
  10449.     ADD.l   d0,a1
  10450.     MOVE.w  -(a2),d0 ; Get x
  10451.     CMP.w   d3,d0 ; X<X1?
  10452.     BLT     _MDrawParticlesClipSkip2
  10453.     CMP.w   d5,d0 ; X>=X2?
  10454.     BGE     _MDrawParticlesClipSkip2
  10455.     ADD.w   d0,a1 ; Find x
  10456.     MOVE.b  -(a0),(a1) ; Draw point
  10457.     SUBQ.l  #1,d1 ; Next pixel
  10458.     BGT     _MDrawParticlesClipLoop
  10459.   RTS;pop
  10460. _MDrawParticlesClipSkip
  10461.     SUB.w   #1,a0 ; Mimic read
  10462.     SUB.w   #2,a2 ; Mimic read
  10463.     SUBQ.l  #1,d1 ; Next pixel
  10464.     BGT     _MDrawParticlesClipLoop
  10465.   RTS;pop
  10466. _MDrawParticlesClipSkip2
  10467.     SUB.w   #1,a0 ; Mimic read
  10468.     SUBQ.l  #1,d1 ; Next pixel
  10469.     BGT     _MDrawParticlesClipLoop
  10470.   RTS
  10471. _MDrawParticlesAddClipLoop
  10472.     MOVE.l  d2,a1 ; Reset base address of dest
  10473.     MOVE.w  -(a2),d0 ; Get y
  10474.     CMP.w   d4,d0 ; Y<Y1?
  10475.     BLT     _MDrawParticlesAddClipSkip
  10476.     CMP.w   d6,d0 ; Y>=Y2?
  10477.     BGE     _MDrawParticlesAddClipSkip
  10478.     MULU    d7,d0 ; Find y bytes
  10479.     ADD.l   d0,a1
  10480.     MOVE.w  -(a2),d0 ; Get x
  10481.     CMP.w   d3,d0 ; X<X1?
  10482.     BLT     _MDrawParticlesAddClipSkip2
  10483.     CMP.w   d5,d0 ; X>=X2?
  10484.     BGE     _MDrawParticlesAddClipSkip2
  10485.     ADD.w   d0,a1 ; Find x
  10486.     MOVE.b  -(a0),d0 ; Get point
  10487.     ADD.b   d0,(a1) ; Draw Add
  10488.     SUBQ.l  #1,d1 ; Next pixel
  10489.     BGT     _MDrawParticlesAddClipLoop
  10490.   RTS;pop
  10491. _MDrawParticlesAddClipSkip
  10492.     SUB.w   #1,a0 ; Mimic read
  10493.     SUB.w   #2,a2 ; Mimic read
  10494.     SUBQ.l  #1,d1 ; Next pixel
  10495.     BGT     _MDrawParticlesAddClipLoop
  10496.   RTS;pop
  10497. _MDrawParticlesAddClipSkip2
  10498.     SUB.w   #1,a0 ; Mimic read
  10499.     SUBQ.l  #1,d1 ; Next pixel
  10500.     BGT     _MDrawParticlesAddClipLoop
  10501.   RTS
  10502. _MDrawParticlesReMap
  10503. ;Draw with remap a buffer of pixels to a bitmap using a list. List contains X.w,Y.w pairs, Buffer contains byte per pixel
  10504.   MOVE.l  d0,a2 ; a2=List memory
  10505.   MOVE.l  a3,-(a7) ; Store
  10506.   MOVE.w  CurrentChunkyTable1,d0
  10507.   !GetTableObjectPtr ; Base in a0
  10508.   MOVE.l  a0,a3 ; a3=table struct
  10509.   MOVE.l  CTable_LMem-ChunkyTables(a3),a3 ; a3=Table base
  10510.   MOVE.w  CurrentChunkyBitmap1,d0 ; Bitmap to plot in
  10511.   !GetBitmapObjectPtr ; Base in a0
  10512.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Data mem
  10513.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  10514.   BEQ     _MDrawParticlesReMapSkip
  10515.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1
  10516. _MDrawParticlesReMapSkip
  10517.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d7 ; Total bytes width
  10518.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  10519.   BNE     _MDrawParticlesReMapClip
  10520.   MOVE.l  a1,d5 ; Store data mem
  10521.   MOVE.l  d2,a0 ; Buffer mem
  10522.   MOVE.l  d1,d0 ; Copy number of pixels
  10523.   LSL.l   #2,d0 ; *4 for offset - number of pixels should be no higher than 2 bits less than signed longword max
  10524.   ADD.l   d0,a2 ; Find end of table
  10525.   ADD.l   d1,a0 ; Find end of buffer
  10526.   MOVEQ.l #0,d2 ; init
  10527.   CMP.w   #5,_ParticleModeType
  10528.   BEQ     _MDrawParticlesReMapComplexLoop
  10529. _MDrawParticlesReMapLoop
  10530.     MOVE.l  d5,a1 ; Reset base address of dest
  10531.     MOVE.w  -(a2),d0 ; Get y
  10532.     MULU    d7,d0 ; Find y bytes
  10533.     ADD.l   d0,a1
  10534.     ADD.w   -(a2),a1 ; Get x
  10535.     MOVE.b  -(a0),d2 ; Get point from buffer
  10536.     MOVE.b  0(a3,d2.w),(a1) ; Plot SimpleReMap
  10537.     SUBQ.l  #1,d1 ; Next pixel
  10538.     BGT     _MDrawParticlesReMapLoop
  10539.   MOVE.l  (a7)+,a3 ; Restore
  10540.   RTS;pop
  10541. _MDrawParticlesReMapComplexLoop
  10542.     MOVE.l  d5,a1 ; Reset base address of dest
  10543.     MOVE.w  -(a2),d0 ; Get y
  10544.     MULU    d7,d0 ; Find y bytes
  10545.     ADD.l   d0,a1
  10546.     ADD.w   -(a2),a1 ; Get x
  10547.     MOVE.b  -(a0),d2 ; Get point from buffer
  10548.     LSL.w   #8,d2
  10549.     MOVE.b  (a1),d2 ; Get dest point
  10550.     MOVE.b  0(a3,d2.l),(a1) ; Plot ReMap
  10551.     SUBQ.l  #1,d1 ; Next pixel
  10552.     BGT     _MDrawParticlesReMapComplexLoop
  10553.   MOVE.l  (a7)+,a3 ; Restore
  10554.   RTS;pop
  10555. _MDrawParticlesReMapClip
  10556. ;Only remap-draw the grabbed particles that are within the clip window
  10557.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  10558.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  10559.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  10560.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  10561.   ADD.w   d3,d5 ; X2 outside of window
  10562.   ADD.w   d4,d6 ; Y2 outside of window
  10563.   MOVE.l  d2,a0 ; Buffer mem
  10564.   MOVE.l  a1,d2 ; Store data mem
  10565.   MOVE.l  d1,d0 ; Copy number of pixels
  10566.   LSL.l   #2,d0 ; *4 for offset
  10567.   ADD.l   d0,a2 ; Find end of table
  10568.   ADD.l   d1,a0 ; Find end of buffer
  10569.   MOVEQ.l #0,d2 ; Init
  10570.   CMP.w   #5,_ParticleModeType
  10571.   BEQ     _MDrawParticlesReMapComplexClipLoop
  10572. _MDrawParticlesReMapClipLoop
  10573.     MOVE.l  d2,a1 ; Reset base address of dest
  10574.     MOVE.w  -(a2),d0 ; Get y
  10575.     CMP.w   d4,d0 ; Y<Y1?
  10576.     BLT     _MDrawParticlesReMapClipSkip
  10577.     CMP.w   d6,d0 ; Y>=Y2?
  10578.     BGE     _MDrawParticlesReMapClipSkip
  10579.     MULU    d7,d0 ; Find y bytes
  10580.     ADD.l   d0,a1
  10581.     MOVE.w  -(a2),d0 ; Get x
  10582.     CMP.w   d3,d0 ; X<X1?
  10583.     BLT     _MDrawParticlesReMapClipSkip2
  10584.     CMP.w   d5,d0 ; X>=X2?
  10585.     BGE     _MDrawParticlesReMapClipSkip2
  10586.     ADD.w   d0,a1 ; Find x
  10587.     MOVE.b  -(a0),d2 ; Get point from buffer
  10588.     MOVE.b  0(a3,d2.w),(a1) ; Plot SimpleReMap
  10589.     SUBQ.l  #1,d1 ; Next pixel
  10590.     BGT     _MDrawParticlesReMapClipLoop
  10591.   RTS;pop
  10592. _MDrawParticlesReMapClipSkip
  10593.     SUB.w   #1,a0 ; Mimic read
  10594.     SUB.w   #2,a2 ; Mimic read
  10595.     SUBQ.l  #1,d1 ; Next pixel
  10596.     BGT     _MDrawParticlesReMapClipLoop
  10597.   RTS;pop
  10598. _MDrawParticlesReMapClipSkip2
  10599.     SUB.w   #1,a0 ; Mimic read
  10600.     SUBQ.l  #1,d1 ; Next pixel
  10601.     BGT     _MDrawParticlesReMapClipLoop
  10602.   RTS
  10603. _MDrawParticlesReMapComplexClipLoop
  10604.     MOVE.l  d2,a1 ; Reset base address of dest
  10605.     MOVE.w  -(a2),d0 ; Get y
  10606.     CMP.w   d4,d0 ; Y<Y1?
  10607.     BLT     _MDrawParticlesReMapComplexClipSkip
  10608.     CMP.w   d6,d0 ; Y>=Y2?
  10609.     BGE     _MDrawParticlesReMapComplexClipSkip
  10610.     MULU    d7,d0 ; Find y bytes
  10611.     ADD.l   d0,a1
  10612.     MOVE.w  -(a2),d0 ; Get x
  10613.     CMP.w   d3,d0 ; X<X1?
  10614.     BLT     _MDrawParticlesReMapComplexClipSkip2
  10615.     CMP.w   d5,d0 ; X>=X2?
  10616.     BGE     _MDrawParticlesReMapComplexClipSkip2
  10617.     ADD.w   d0,a1 ; Find x
  10618.     MOVE.b  -(a0),d2 ; Get point from buffer
  10619.     LSL.w   #8,d2
  10620.     MOVE.b  (a1),d2 ; Get dest point
  10621.     MOVE.b  0(a3,d2.w),(a1) ; Plot ReMap
  10622.     SUBQ.l  #1,d1 ; Next pixel
  10623.     BGT     _MDrawParticlesReMapComplexClipLoop
  10624.   RTS;pop
  10625. _MDrawParticlesReMapComplexClipSkip
  10626.     SUB.w   #1,a0 ; Mimic read
  10627.     SUB.w   #2,a2 ; Mimic read
  10628.     SUBQ.l  #1,d1 ; Next pixel
  10629.     BGT     _MDrawParticlesReMapComplexClipLoop
  10630.   RTS;pop
  10631. _MDrawParticlesReMapComplexClipSkip2
  10632.     SUB.w   #1,a0 ; Mimic read
  10633.     SUBQ.l  #1,d1 ; Next pixel
  10634.     BGT     _MDrawParticlesReMapComplexClipLoop
  10635.   RTS
  10636.  
  10637. _MDrawParticlesA
  10638. ;Draw a buffer of pixels to a bitmap using a list. List contains Ptr.l actual addresses, Buffer contains byte per pixel
  10639. ;Drawing is done backwards to facilitate a stack for proper background restore
  10640.   CMP.w   #5,_ParticleModeType
  10641.   BEQ     _MDrawParticlesAReMap
  10642.   CMP.w   #6,_ParticleModeType
  10643.   BEQ     _MDrawParticlesAReMap
  10644.   MOVE.l  d0,a2 ; a2=List memory
  10645.   MOVE.l  d2,a0 ; Buffer mem
  10646.   MOVE.l  d1,d0 ; Copy number of pixels
  10647.   LSL.l   #2,d0 ; *4 for offset - number of pixels should be no higher than 2 bits less than signed longword max
  10648.   ADD.l   d0,a2 ; Find end of table
  10649.   ADD.l   d1,a0 ; Find end of buffer
  10650.   CMP.w   #7,_ParticleModeType
  10651.   BEQ     _MDrawParticlesAAddLoop
  10652. _MDrawParticlesALoop
  10653.     MOVE.l  -(a2),a1 ; Get address
  10654.     MOVE.b  -(a0),(a1) ; Draw point
  10655.     SUBQ.l  #1,d1 ; Next pixel
  10656.     BGT     _MDrawParticlesALoop
  10657.   RTS
  10658. _MDrawParticlesAAddLoop
  10659.     MOVE.l  -(a2),a1 ; Get address
  10660.     MOVE.b  -(a0),d0 ; Get point
  10661.     ADD.b   d0,(a1) ; Draw Add
  10662.     SUBQ.l  #1,d1 ; Next pixel
  10663.     BGT     _MDrawParticlesAAddLoop
  10664.   RTS
  10665. _MDrawParticlesAReMap
  10666.   MOVE.l  a3,-(a7) ; Store
  10667.   MOVE.l  d0,a2 ; a2=List memory
  10668.   MOVE.w  CurrentChunkyTable1,d0 ; Table to use
  10669.   !GetTableObjectPtr ; Base in a0
  10670.   MOVE.l  a0,a3 ; a3=Table base
  10671.   MOVE.l  d2,a0 ; Buffer mem
  10672.   MOVE.l  d1,d0 ; Copy number of pixels
  10673.   LSL.l   #2,d0 ; *4 for offset - number of pixels should be no higher than 2 bits less than signed longword max
  10674.   ADD.l   d0,a2 ; Find end of table
  10675.   ADD.l   d1,a0 ; Find end of buffer
  10676.   MOVE.l  CTable_LMem-ChunkyTables(a3),a3 ; a3=Table base
  10677.   CMP.w   #5,_ParticleModeType ; Simple or complex?
  10678.   BEQ     _MDrawParticlesAReMapComplex
  10679.   MOVEQ.l #0,d2 ; Init
  10680. _MDrawParticlesAReMapLoop
  10681.     MOVE.l  -(a2),a1 ; Get Ptr.l
  10682.     MOVE.b  -(a0),d2 ; Get point from buffer
  10683.     MOVE.b  0(a3,d2.w),(a1) ; Plot SimpleReMap
  10684.     SUBQ.l  #1,d1 ; Next pixel
  10685.     BGT     _MDrawParticlesAReMapLoop
  10686.   MOVE.l  (a7)+,a3 ; Restore
  10687.   RTS;pop
  10688. _MDrawParticlesAReMapComplex
  10689.   MOVEQ.l #0,d2 ; Init
  10690. _MDrawParticlesAReMapComplexLoop
  10691.     MOVE.l  -(a2),a1 ; Get Ptr.l
  10692.     MOVE.b  -(a0),d2 ; Get buffer
  10693.     LSL.w   #8,d2
  10694.     MOVE.b  (a1),d2 ; Get dest point
  10695.     MOVE.b  0(a3,d2.l),(a1) ; Plot ReMap
  10696.     SUBQ.l  #1,d1 ; Next pixel
  10697.     BGT     _MDrawParticlesAReMapComplexLoop
  10698.   MOVE.l  (a7)+,a3 ; Restore
  10699.   RTS
  10700.  
  10701. _MDrawParticlesQ
  10702. ;Draw a buffer of pixels to a bitmap using a list. List contains X.q,Y.q pairs, Buffer contains byte per pixel
  10703. ;Drawing is done backwards to facilitate a stack for proper background restore
  10704.   CMP.w   #5,_ParticleModeType
  10705.   BEQ     _MDrawParticlesQReMap
  10706.   CMP.w   #6,_ParticleModeType
  10707.   BEQ     _MDrawParticlesQReMap
  10708.   MOVE.l  d0,a2 ; a2=List memory
  10709.   MOVE.w  CurrentChunkyBitmap1,d0 ; Bitmap to plot in
  10710.   !GetBitmapObjectPtr ; Base in a0
  10711.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Data mem
  10712.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  10713.   BEQ     _MDrawParticlesQSkip
  10714.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1
  10715. _MDrawParticlesQSkip
  10716.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d7 ; Total bytes width
  10717.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  10718.   BNE     _MDrawParticlesQClip
  10719.   MOVE.l  a1,d5 ; Store data mem
  10720.   MOVE.l  d2,a0 ; Buffer mem
  10721.   MOVE.l  d1,d0 ; Copy number of pixels
  10722.   LSL.l   #3,d0 ; *8 for offset - number of pixels should be no higher than 3 bits less than signed longword max
  10723.   ADD.l   d0,a2 ; Find end of table
  10724.   ADD.l   d1,a0 ; Find end of buffer
  10725.   SUB.w   #8,a2 ; Start of last pair
  10726.   MOVEQ.l #0,d2 ; Init
  10727.   CMP.w   #7,_ParticleModeType
  10728.   BEQ     _MDrawParticlesQAddLoop
  10729. _MDrawParticlesQLoop
  10730.     MOVE.l  d5,a1 ; Reset base address of dest
  10731.     MOVE.w  4(a2),d0 ; Get y
  10732.     MULU    d7,d0 ; Find y bytes
  10733.     ADD.l   d0,a1
  10734.     ADD.w   (a2),a1 ; Get x
  10735.     MOVE.b  -(a0),(a1) ; Draw point
  10736.     SUB.w   #8,a2 ; Next
  10737.     SUBQ.l  #1,d1 ; Next pixel
  10738.     BGT     _MDrawParticlesQLoop
  10739.   RTS;pop
  10740. _MDrawParticlesQAddLoop
  10741.     MOVE.l  d5,a1 ; Reset base address of dest
  10742.     MOVE.w  4(a2),d0 ; Get y
  10743.     MULU    d7,d0 ; Find y bytes
  10744.     MOVE.b  -(a0),d2 ; Get point
  10745.     ADD.l   d0,a1
  10746.     ADD.w   (a2),a1 ; Get x
  10747.     ADD.b   d2,(a1) ; Draw Add
  10748.     SUB.w   #8,a2 ; Next
  10749.     SUBQ.l  #1,d1 ; Next pixel
  10750.     BGT     _MDrawParticlesQAddLoop
  10751.   RTS;pop
  10752. _MDrawParticlesQClip
  10753. ;Only draw the grabbed particles that are within the clip window
  10754.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  10755.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  10756.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  10757.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  10758.   ADD.w   d3,d5 ; X2 outside of window
  10759.   ADD.w   d4,d6 ; Y2 outside of window
  10760.   MOVE.l  d2,a0 ; Buffer mem
  10761.   MOVE.l  a1,d2 ; Store data mem
  10762.   MOVE.l  d1,d0 ; Copy number of pixels
  10763.   LSL.l   #3,d0 ; *8 for offset
  10764.   ADD.l   d0,a2 ; Find end of table
  10765.   ADD.l   d1,a0 ; Find end of buffer
  10766.   SUB.w   #8,a2 ; Start of last pair
  10767.   MOVEQ.l #0,d2 ; Init
  10768.   CMP.w   #7,_ParticleModeType
  10769.   BEQ     _MDrawParticlesQAddClipLoop
  10770. _MDrawParticlesQClipLoop
  10771.     MOVE.l  d2,a1 ; Reset base address of dest
  10772.     MOVE.w  4(a2),d0 ; Get y
  10773.     CMP.w   d4,d0 ; Y<Y1?
  10774.     BLT     _MDrawParticlesQClipSkip
  10775.     CMP.w   d6,d0 ; Y>=Y2?
  10776.     BGE     _MDrawParticlesQClipSkip
  10777.     MULU    d7,d0 ; Find y bytes
  10778.     ADD.l   d0,a1
  10779.     MOVE.w  (a2),d0 ; Get x
  10780.     CMP.w   d3,d0 ; X<X1?
  10781.     BLT     _MDrawParticlesQClipSkip
  10782.     CMP.w   d5,d0 ; X>=X2?
  10783.     BGE     _MDrawParticlesQClipSkip
  10784.     ADD.w   d0,a1 ; Find x
  10785.     MOVE.b  -(a0),(a1) ; Draw point
  10786.     SUB.w   #8,a2 ; Next
  10787.     SUBQ.l  #1,d1 ; Next pixel
  10788.     BGT     _MDrawParticlesQClipLoop
  10789.   RTS;pop
  10790. _MDrawParticlesQClipSkip
  10791.     SUB.w   #1,a0 ; Mimic read
  10792.     SUB.w   #8,a2 ; Next
  10793.     SUBQ.l  #1,d1 ; Next pixel
  10794.     BGT     _MDrawParticlesQClipLoop
  10795.   RTS;pop
  10796. _MDrawParticlesQAddClipLoop
  10797.     MOVE.l  d2,a1 ; Reset base address of dest
  10798.     MOVE.w  4(a2),d0 ; Get y
  10799.     CMP.w   d4,d0 ; Y<Y1?
  10800.     BLT     _MDrawParticlesQAddClipSkip
  10801.     CMP.w   d6,d0 ; Y>=Y2?
  10802.     BGE     _MDrawParticlesQAddClipSkip
  10803.     MULU    d7,d0 ; Find y bytes
  10804.     ADD.l   d0,a1
  10805.     MOVE.w  (a2),d0 ; Get x
  10806.     CMP.w   d3,d0 ; X<X1?
  10807.     BLT     _MDrawParticlesQAddClipSkip
  10808.     CMP.w   d5,d0 ; X>=X2?
  10809.     BGE     _MDrawParticlesQAddClipSkip
  10810.     ADD.w   d0,a1 ; Find x
  10811.     MOVE.b  -(a0),d0 ; Get point
  10812.     ADD.b   d0,(a1) ; Draw Add
  10813.     SUB.w   #8,a2 ; Next
  10814.     SUBQ.l  #1,d1 ; Next pixel
  10815.     BGT     _MDrawParticlesQAddClipLoop
  10816.   RTS;pop
  10817. _MDrawParticlesQAddClipSkip
  10818.     SUB.w   #1,a0 ; Mimic read
  10819.     SUB.w   #8,a2 ; Next
  10820.     SUBQ.l  #1,d1 ; Next pixel
  10821.     BGT     _MDrawParticlesQAddClipLoop
  10822.   RTS;pop
  10823. _MDrawParticlesQReMap
  10824. ;Draw with remap a buffer of pixels to a bitmap using a list. List contains X.w,Y.w pairs, Buffer contains byte per pixel
  10825.   MOVE.l  d0,a2 ; a2=List memory
  10826.   MOVE.l  a3,-(a7) ; Store
  10827.   MOVE.w  CurrentChunkyTable1,d0
  10828.   !GetTableObjectPtr ; Base in a0
  10829.   MOVE.l  a0,a3 ; a3=table struct
  10830.   MOVE.l  CTable_LMem-ChunkyTables(a3),a3 ; a3=Table base
  10831.   MOVE.w  CurrentChunkyBitmap1,d0 ; Bitmap to plot in
  10832.   !GetBitmapObjectPtr ; Base in a0
  10833.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Data mem
  10834.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  10835.   BEQ     _MDrawParticlesQReMapSkip
  10836.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1
  10837. _MDrawParticlesQReMapSkip
  10838.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d7 ; Total bytes width
  10839.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  10840.   BNE     _MDrawParticlesQReMapClip
  10841.   MOVE.l  a1,d5 ; Store data mem
  10842.   MOVE.l  d2,a0 ; Buffer mem
  10843.   MOVE.l  d1,d0 ; Copy number of pixels
  10844.   LSL.l   #3,d0 ; *8 for offset - number of pixels should be no higher than 3 bits less than signed longword max
  10845.   ADD.l   d0,a2 ; Find end of table
  10846.   ADD.l   d1,a0 ; Find end of buffer
  10847.   SUB.w   #8,a2 ; Find last pair
  10848.   MOVEQ.l #0,d2 ; init
  10849.   CMP.w   #5,_ParticleModeType
  10850.   BEQ     _MDrawParticlesQReMapComplexLoop
  10851. _MDrawParticlesQReMapLoop
  10852.     MOVE.l  d5,a1 ; Reset base address of dest
  10853.     MOVE.w  4(a2),d0 ; Get y
  10854.     MULU    d7,d0 ; Find y bytes
  10855.     ADD.l   d0,a1
  10856.     ADD.w   (a2),a1 ; Get x
  10857.     MOVE.b  -(a0),d2 ; Get point from buffer
  10858.     MOVE.b  0(a3,d2.w),(a1) ; Plot SimpleReMap
  10859.     SUB.w   #8,a2 ; Next
  10860.     SUBQ.l  #1,d1 ; Next pixel
  10861.     BGT     _MDrawParticlesQReMapLoop
  10862.   MOVE.l  (a7)+,a3 ; Restore
  10863.   RTS;pop
  10864. _MDrawParticlesQReMapComplexLoop
  10865.     MOVE.l  d5,a1 ; Reset base address of dest
  10866.     MOVE.w  4(a2),d0 ; Get y
  10867.     MULU    d7,d0 ; Find y bytes
  10868.     ADD.l   d0,a1
  10869.     ADD.w   (a2),a1 ; Get x
  10870.     MOVE.b  -(a0),d2 ; Get point from buffer
  10871.     LSL.w   #8,d2
  10872.     MOVE.b  (a1),d2 ; Get dest point
  10873.     MOVE.b  0(a3,d2.l),(a1) ; Plot ReMap
  10874.     SUB.w   #8,a2 ; Next
  10875.     SUBQ.l  #1,d1 ; Next pixel
  10876.     BGT     _MDrawParticlesQReMapComplexLoop
  10877.   MOVE.l  (a7)+,a3 ; Restore
  10878.   RTS;pop
  10879. _MDrawParticlesQReMapClip
  10880. ;Only remap-draw the grabbed particles that are within the clip window
  10881.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  10882.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  10883.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  10884.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  10885.   ADD.w   d3,d5 ; X2 outside of window
  10886.   ADD.w   d4,d6 ; Y2 outside of window
  10887.   MOVE.l  d2,a0 ; Buffer mem
  10888.   MOVE.l  a1,d2 ; Store data mem
  10889.   MOVE.l  d1,d0 ; Copy number of pixels
  10890.   LSL.l   #3,d0 ; *8 for offset
  10891.   ADD.l   d0,a2 ; Find end of table
  10892.   ADD.l   d1,a0 ; Find end of buffer
  10893.   SUB.w   #8,a2 ; Find last pair
  10894.   MOVEQ.l #0,d2 ; Init
  10895.   CMP.w   #5,_ParticleModeType
  10896.   BEQ     _MDrawParticlesQReMapComplexClipLoop
  10897. _MDrawParticlesQReMapClipLoop
  10898.     MOVE.l  d2,a1 ; Reset base address of dest
  10899.     MOVE.w  4(a2),d0 ; Get y
  10900.     CMP.w   d4,d0 ; Y<Y1?
  10901.     BLT     _MDrawParticlesQReMapClipSkip
  10902.     CMP.w   d6,d0 ; Y>=Y2?
  10903.     BGE     _MDrawParticlesQReMapClipSkip
  10904.     MULU    d7,d0 ; Find y bytes
  10905.     ADD.l   d0,a1
  10906.     MOVE.w  (a2),d0 ; Get x
  10907.     CMP.w   d3,d0 ; X<X1?
  10908.     BLT     _MDrawParticlesQReMapClipSkip
  10909.     CMP.w   d5,d0 ; X>=X2?
  10910.     BGE     _MDrawParticlesQReMapClipSkip
  10911.     ADD.w   d0,a1 ; Find x
  10912.     MOVE.b  -(a0),d2 ; Get point from buffer
  10913.     MOVE.b  0(a3,d2.w),(a1) ; Plot SimpleReMap
  10914.     SUB.w   #8,a2 ; Next
  10915.     SUBQ.l  #1,d1 ; Next pixel
  10916.     BGT     _MDrawParticlesQReMapClipLoop
  10917.   RTS;pop
  10918. _MDrawParticlesQReMapClipSkip
  10919.     SUB.w   #1,a0 ; Mimic read
  10920.     SUB.w   #8,a2 ; Next
  10921.     SUBQ.l  #1,d1 ; Next pixel
  10922.     BGT     _MDrawParticlesQReMapClipLoop
  10923.   RTS;pop
  10924. _MDrawParticlesQReMapComplexClipLoop
  10925.     MOVE.l  d2,a1 ; Reset base address of dest
  10926.     MOVE.w  4(a2),d0 ; Get y
  10927.     CMP.w   d4,d0 ; Y<Y1?
  10928.     BLT     _MDrawParticlesQReMapComplexClipSkip
  10929.     CMP.w   d6,d0 ; Y>=Y2?
  10930.     BGE     _MDrawParticlesQReMapComplexClipSkip
  10931.     MULU    d7,d0 ; Find y bytes
  10932.     ADD.l   d0,a1
  10933.     MOVE.w  (a2),d0 ; Get x
  10934.     CMP.w   d3,d0 ; X<X1?
  10935.     BLT     _MDrawParticlesQReMapComplexClipSkip
  10936.     CMP.w   d5,d0 ; X>=X2?
  10937.     BGE     _MDrawParticlesQReMapComplexClipSkip
  10938.     ADD.w   d0,a1 ; Find x
  10939.     MOVE.b  -(a0),d2 ; Get point from buffer
  10940.     LSL.w   #8,d2
  10941.     MOVE.b  (a1),d2 ; Get dest point
  10942.     MOVE.b  0(a3,d2.l),(a1) ; Plot ReMap
  10943.     SUB.w   #8,a2 ; Next
  10944.     SUBQ.l  #1,d1 ; Next pixel
  10945.     BGT     _MDrawParticlesQReMapComplexClipLoop
  10946.   RTS;pop
  10947. _MDrawParticlesQReMapComplexClipSkip
  10948.     SUB.w   #1,a0 ; Mimic read
  10949.     SUB.w   #8,a2 ; Next
  10950.     SUBQ.l  #1,d1 ; Next pixel
  10951.     BGT     _MDrawParticlesQReMapComplexClipLoop
  10952.   RTS
  10953.  
  10954. ;*************************************************************************************
  10955.  
  10956. _MGrabParticlesAndPlotShort
  10957.   MOVEQ.l #0,d3 ; Init
  10958.   MOVE.b  CurrentInk1,d3 ; Colour to use
  10959. _MGrabParticlesAndPlot
  10960. ;Grab and Plot a list of pixels in a bitmap to specified or ink colour. List contains X.w,Y.w pairs, Buffer contains bytes
  10961.   TST.b   _ParticleFormat ; What format?
  10962.   BLT     _MGrabParticlesAndPlotQ ; Data is in X.q,Y.q format
  10963.   BGT     _MGrabParticlesAndPlotA ; Data is in Ptr.l format
  10964.   ;Data is in X.w,Y.w format
  10965.   CMP.w   #5,_ParticleModeType
  10966.   BEQ     _MGrabParticlesAndPlotReMap
  10967.   CMP.w   #6,_ParticleModeType
  10968.   BEQ     _MGrabParticlesAndPlotReMap
  10969.   MOVE.l  d0,a2 ; a2=List memory
  10970.   MOVE.l  a5,-(a7) ; Store
  10971.   MOVE.l  d2,a5 ; a5=Buffer mem
  10972.   MOVE.w  CurrentChunkyBitmap1,d0 ; Bitmap to plot in
  10973.   !GetBitmapObjectPtr ; Base in a0
  10974.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Data mem
  10975.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  10976.   BEQ     _MGrabParticlesAndPlotSkip
  10977.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1
  10978. _MGrabParticlesAndPlotSkip
  10979.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d7 ; Total bytes width
  10980.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  10981.   BNE     _MGrabParticlesAndPlotClip
  10982.   MOVE.l  a1,d5 ; Store data mem
  10983.   CMP.w   #7,_ParticleModeType
  10984.   BEQ     _MGrabParticlesAndPlotAddLoop
  10985. _MGrabParticlesAndPlotLoop
  10986.     MOVE.l  d5,a1 ; Reset base address of dest
  10987.     ADD.w   (a2)+,a1 ; Get x
  10988.     MOVE.w  (a2)+,d0 ; Get y
  10989.     MULU    d7,d0 ; Find y bytes
  10990.     ADD.l   d0,a1
  10991.     MOVE.b  (a1),(a5)+ ; Grab point
  10992.     MOVE.b  d3,(a1) ; Plot point
  10993.     SUBQ.l  #1,d1 ; Next pixel
  10994.     BGT     _MGrabParticlesAndPlotLoop
  10995.   MOVE.l  (a7)+,a5 ; Restore
  10996.   RTS;pop
  10997. _MGrabParticlesAndPlotAddLoop
  10998.     MOVE.l  d5,a1 ; Reset base address of dest
  10999.     ADD.w   (a2)+,a1 ; Get x
  11000.     MOVE.w  (a2)+,d0 ; Get y
  11001.     MULU    d7,d0 ; Find y bytes
  11002.     ADD.l   d0,a1
  11003.     MOVE.b  (a1),(a5)+ ; Grab point
  11004.     ADD.b   d3,(a1) ; Plot Add
  11005.     SUBQ.l  #1,d1 ; Next pixel
  11006.     BGT     _MGrabParticlesAndPlotLoop
  11007.   MOVE.l  (a7)+,a5 ; Restore
  11008.   RTS;pop
  11009. _MGrabParticlesAndPlotClip
  11010. ;Only do the particles that are within the clip window
  11011.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d2 ; X1
  11012.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  11013.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  11014.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  11015.   ADD.w   d2,d5 ; X2 outside of window
  11016.   ADD.w   d4,d6 ; Y2 outside of window
  11017.   MOVE.l  a3,-(a7) ; Store
  11018.   MOVE.l  a1,a3 ; Store data mem
  11019.   CMP.w   #7,_ParticleModeType
  11020.   BEQ     _MGrabParticlesAndPlotAddClipLoop
  11021. _MGrabParticlesAndPlotClipLoop
  11022.     MOVE.l  a3,a1 ; Reset base address of dest
  11023.     MOVE.w  (a2)+,d0 ; Get x
  11024.     CMP.w   d2,d0 ; X<X1?
  11025.     BLT     _MGrabParticlesAndPlotClipSkip
  11026.     CMP.w   d5,d0 ; X>=X2?
  11027.     BGE     _MGrabParticlesAndPlotClipSkip
  11028.     ADD.w   d0,a1 ; Find x
  11029.     MOVE.w  (a2)+,d0 ; Get y
  11030.     CMP.w   d4,d0 ; Y<Y1?
  11031.     BLT     _MGrabParticlesAndPlotClipSkip2
  11032.     CMP.w   d6,d0 ; Y>=Y2?
  11033.     BGE     _MGrabParticlesAndPlotClipSkip2
  11034.     MULU    d7,d0 ; Find y bytes
  11035.     ADD.l   d0,a1
  11036.     MOVE.b  (a1),(a5)+ ; Grab point
  11037.     MOVE.b  d3,(a1) ; Plot point
  11038.     SUBQ.l  #1,d1 ; Next pixel
  11039.     BGT     _MGrabParticlesAndPlotClipLoop
  11040.   MOVE.l  (a7)+,a3
  11041.   MOVE.l  (a7)+,a5
  11042.   RTS;pop
  11043. _MGrabParticlesAndPlotClipSkip
  11044.     ADD.w   #2,a2 ; Mimic read
  11045. _MGrabParticlesAndPlotClipSkip2
  11046.     ADD.w   #1,a5 ; Mimic grab
  11047.     SUBQ.l  #1,d1 ; Next pixel
  11048.     BGT     _MGrabParticlesAndPlotClipLoop
  11049.   MOVE.l  (a7)+,a3
  11050.   MOVE.l  (a7)+,a5
  11051.   RTS;pop
  11052. _MGrabParticlesAndPlotAddClipLoop
  11053.     MOVE.l  a3,a1 ; Reset base address of dest
  11054.     MOVE.w  (a2)+,d0 ; Get x
  11055.     CMP.w   d2,d0 ; X<X1?
  11056.     BLT     _MGrabParticlesAndPlotAddClipSkip
  11057.     CMP.w   d5,d0 ; X>=X2?
  11058.     BGE     _MGrabParticlesAndPlotAddClipSkip
  11059.     ADD.w   d0,a1 ; Find x
  11060.     MOVE.w  (a2)+,d0 ; Get y
  11061.     CMP.w   d4,d0 ; Y<Y1?
  11062.     BLT     _MGrabParticlesAndPlotAddClipSkip2
  11063.     CMP.w   d6,d0 ; Y>=Y2?
  11064.     BGE     _MGrabParticlesAndPlotAddClipSkip2
  11065.     MULU    d7,d0 ; Find y bytes
  11066.     ADD.l   d0,a1
  11067.     MOVE.b  (a1),(a5)+ ; Grab point
  11068.     ADD.b   d3,(a1) ; Plot Add
  11069.     SUBQ.l  #1,d1 ; Next pixel
  11070.     BGT     _MGrabParticlesAndPlotAddClipLoop
  11071.   MOVE.l  (a7)+,a3
  11072.   MOVE.l  (a7)+,a5
  11073.   RTS;pop
  11074. _MGrabParticlesAndPlotAddClipSkip
  11075.     ADD.w   #2,a2 ; Mimic read
  11076. _MGrabParticlesAndPlotAddClipSkip2
  11077.     ADD.w   #1,a5 ; Mimic grab
  11078.     SUBQ.l  #1,d1 ; Next pixel
  11079.     BGT     _MGrabParticlesAndPlotAddClipLoop
  11080.   MOVE.l  (a7)+,a3
  11081.   MOVE.l  (a7)+,a5
  11082.   RTS;pop
  11083. _MGrabParticlesAndPlotReMap
  11084. ;Remap a list of X.w,Y.w particles in a bitmap, perhaps combining with specified colour. List contains X.w,Y.w pairs
  11085.   MOVE.l  a5,-(a7) ; Store
  11086.   MOVE.l  d2,a5 ; a5=Buffer mem
  11087.   MOVE.l  a3,-(a7) ; Store
  11088.   MOVE.l  d0,a2 ; a2=List memory
  11089.   MOVE.w  CurrentChunkyTable1,d0 ; Table to use
  11090.   !GetTableObjectPtr ; Base in a0
  11091.   MOVE.l  CTable_LMem-ChunkyTables(a0),a3 ; a3=Table base
  11092.   MOVE.w  CurrentChunkyBitmap1,d0 ; Bitmap to plot in
  11093.   !GetBitmapObjectPtr ; Base in a0
  11094.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Data mem
  11095.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  11096.   BEQ     _MGrabParticlesAndPlotReMapSkip
  11097.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1
  11098. _MGrabParticlesAndPlotReMapSkip
  11099.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d7 ; Total bytes width
  11100.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  11101.   BNE     _MGrabParticlesAndPlotReMapClip
  11102.   MOVE.l  a1,d5 ; Store data mem
  11103.   CMP.w   #5,_ParticleModeType ; Simple or complex?
  11104.   BEQ     _MGrabParticlesAndPlotReMapComplex
  11105.   MOVEQ.l #0,d2 ; Init
  11106. _MGrabParticlesAndPlotReMapLoop
  11107.     MOVE.l  d5,a1 ; Reset base address of dest
  11108.     ADD.w   (a2)+,a1 ; Get x
  11109.     MOVE.w  (a2)+,d0 ; Get y
  11110.     MULU    d7,d0 ; Find y bytes
  11111.     ADD.l   d0,a1
  11112.     MOVE.b  (a1),d2 ; Get point
  11113.     MOVE.b  0(a3,d2.w),(a1) ; Plot SimpleReMap
  11114.     MOVE.b  d2,(a5)+ ; Grab point
  11115.     SUBQ.l  #1,d1 ; Next pixel
  11116.     BGT     _MGrabParticlesAndPlotReMapLoop
  11117.   MOVE.l  (a7)+,a3 ; Restore
  11118.   MOVE.l  (a7)+,a5 ; Restore
  11119.   RTS;pop
  11120. _MGrabParticlesAndPlotReMapComplex
  11121.   LSL.w   #8,d2 ; Make upper portion of offset
  11122.   AND.l   #$0000FF00,d2
  11123. _MGrabParticlesAndPlotReMapComplexLoop
  11124.     MOVE.l  d5,a1 ; Reset base address of dest
  11125.     ADD.w   (a2)+,a1 ; Get x
  11126.     MOVE.w  (a2)+,d0 ; Get y
  11127.     MULU    d7,d0 ; Find y bytes
  11128.     ADD.l   d0,a1
  11129.     MOVE.b  (a1),d2 ; Get point
  11130.     MOVE.b  0(a3,d2.l),(a1) ; Plot ReMap
  11131.     MOVE.b  d2,(a5)+ ; Grab point
  11132.     SUBQ.l  #1,d1 ; Next pixel
  11133.     BGT     _MGrabParticlesAndPlotReMapComplexLoop
  11134.   MOVE.l  (a7)+,a3 ; Restore
  11135.   MOVE.l  (a7)+,a5 ; Restore
  11136.   RTS;pop
  11137. _MGrabParticlesAndPlotReMapClip
  11138. ;Only remap the particles that are within the clip window
  11139.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  11140.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  11141.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  11142.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  11143.   ADD.w   d3,d5 ; X2 outside of window
  11144.   ADD.w   d4,d6 ; Y2 outside of window
  11145.   MOVE.l  a4,-(a7) ; Store
  11146.   MOVE.l  a1,a4 ; Store data mem
  11147.   CMP.w   #5,_ParticleModeType ; Simple or complex?
  11148.   BEQ     _MGrabParticlesAndPlotReMapClipComplex
  11149.   MOVEQ.l #0,d2 ; Init
  11150. _MGrabParticlesAndPlotReMapClipLoop
  11151.     MOVE.l  a4,a1 ; Reset base address of dest
  11152.     MOVE.w  (a2)+,d0 ; Get x
  11153.     CMP.w   d3,d0 ; X<X1?
  11154.     BLT     _MGrabParticlesAndPlotReMapClipSkip
  11155.     CMP.w   d5,d0 ; X>=X2?
  11156.     BGE     _MGrabParticlesAndPlotReMapClipSkip
  11157.     ADD.w   d0,a1 ; Find x
  11158.     MOVE.w  (a2)+,d0 ; Get y
  11159.     CMP.w   d4,d0 ; Y<Y1?
  11160.     BLT     _MGrabParticlesAndPlotReMapClipSkip2
  11161.     CMP.w   d6,d0 ; Y>=Y2?
  11162.     BGE     _MGrabParticlesAndPlotReMapClipSkip2
  11163.     MULU    d7,d0 ; Find y bytes
  11164.     ADD.l   d0,a1
  11165.     MOVE.b  (a1),d2 ; Get point
  11166.     MOVE.b  0(a3,d2.w),(a1) ; Plot SimpleReMap
  11167.     MOVE.b  d2,(a5)+ ; Grab point
  11168.     SUBQ.l  #1,d1 ; Next pixel
  11169.     BGT     _MGrabParticlesAndPlotReMapClipLoop
  11170.   MOVE.l  (a7)+,a4
  11171.   MOVE.l  (a7)+,a3
  11172.   MOVE.l  (a7)+,a5
  11173.   RTS;pop
  11174. _MGrabParticlesAndPlotReMapClipSkip
  11175.     ADD.w   #2,a2 ; Mimic read
  11176. _MGrabParticlesAndPlotReMapClipSkip2
  11177.     ADD.w   #1,a5 ; Mimic grab
  11178.     SUBQ.l  #1,d1 ; Next pixel
  11179.     BGT     _MGrabParticlesAndPlotReMapClipLoop
  11180.   MOVE.l  (a7)+,a4
  11181.   MOVE.l  (a7)+,a3
  11182.   MOVE.l  (a7)+,a5
  11183.   RTS;pop
  11184. _MGrabParticlesAndPlotReMapClipComplex
  11185.   LSL.w   #8,d2 ; Make upper portion of offset
  11186.   AND.l   #$0000FF00,d2
  11187. _MGrabParticlesAndPlotReMapClipComplexLoop
  11188.     MOVE.l  a4,a1 ; Reset base address of dest
  11189.     MOVE.w  (a2)+,d0 ; Get x
  11190.     CMP.w   d3,d0 ; X<X1?
  11191.     BLT     _MGrabParticlesAndPlotReMapClipComplexSkip
  11192.     CMP.w   d5,d0 ; X>=X2?
  11193.     BGE     _MGrabParticlesAndPlotReMapClipComplexSkip
  11194.     ADD.w   d0,a1 ; Find x
  11195.     MOVE.w  (a2)+,d0 ; Get y
  11196.     CMP.w   d4,d0 ; Y<Y1?
  11197.     BLT     _MGrabParticlesAndPlotReMapClipComplexSkip2
  11198.     CMP.w   d6,d0 ; Y>=Y2?
  11199.     BGE     _MGrabParticlesAndPlotReMapClipComplexSkip2
  11200.     MULU    d7,d0 ; Find y bytes
  11201.     ADD.l   d0,a1
  11202.     MOVE.b  (a1),d2 ; Get point
  11203.     MOVE.b  0(a3,d2.l),(a1) ; Plot ReMap
  11204.     MOVE.b  d2,(a5)+ ; Grab point
  11205.     SUBQ.l  #1,d1 ; Next pixel
  11206.     BGT     _MGrabParticlesAndPlotReMapClipComplexLoop
  11207.   MOVE.l  (a7)+,a4
  11208.   MOVE.l  (a7)+,a3
  11209.   MOVE.l  (a7)+,a5
  11210.   RTS;pop
  11211. _MGrabParticlesAndPlotReMapClipComplexSkip
  11212.     ADD.w   #2,a2 ; Mimic read
  11213. _MGrabParticlesAndPlotReMapClipComplexSkip2
  11214.     ADD.w   #1,a5 ; Mimic grab
  11215.     SUBQ.l  #1,d1 ; Next pixel
  11216.     BGT     _MGrabParticlesAndPlotReMapClipComplexLoop
  11217.   MOVE.l  (a7)+,a4
  11218.   MOVE.l  (a7)+,a3
  11219.   MOVE.l  (a7)+,a5
  11220.   RTS
  11221.  
  11222. _MGrabParticlesAndPlotA
  11223. ;Grab a list of pixels from a bitmap and plot same pixels to specified or ink colour. List contains Ptr.l actual addresses
  11224.   CMP.w   #5,_ParticleModeType
  11225.   BEQ     _MGrabParticlesAndPlotAReMap
  11226.   CMP.w   #6,_ParticleModeType
  11227.   BEQ     _MGrabParticlesAndPlotAReMap
  11228.   MOVE.l  d0,a2 ; a2=List memory
  11229.   MOVE.l  d2,a0 ; a0=Stack memory
  11230.   CMP.w   #7,_ParticleModeType
  11231.   BEQ     _MGrabParticlesAndPlotAAddLoop
  11232. _MGrabParticlesAndPlotALoop
  11233.     MOVE.l  (a2)+,a1 ; Get address
  11234.     MOVE.b  (a1),(a0)+ ; Grab point
  11235.     MOVE.b  d3,(a1) ; Plot point
  11236.     SUBQ.l  #1,d1 ; Next pixel
  11237.     BGT     _MGrabParticlesAndPlotALoop
  11238.   RTS;pop
  11239. _MGrabParticlesAndPlotAAddLoop
  11240.     MOVE.l  (a2)+,a1 ; Get address
  11241.     MOVE.b  (a1),(a0)+ ; Grab point
  11242.     ADD.b   d3,(a1) ; Plot Add
  11243.     SUBQ.l  #1,d1 ; Next pixel
  11244.     BGT     _MGrabParticlesAndPlotAAddLoop
  11245.   RTS;pop
  11246. _MGrabParticlesAndPlotAReMap
  11247. ;Grab and Remap a list of Ptr.l particles in a bitmap, perhaps combining with specified colour. List contains Ptr.l addresses
  11248.   MOVE.l  a3,-(a7) ; Store
  11249.   MOVE.l  d0,a2 ; a2=List memory
  11250.   MOVE.l  d2,a3 ; a3=Stack memory
  11251.   MOVE.w  CurrentChunkyTable1,d0 ; Table to use
  11252.   !GetTableObjectPtr ; Base in a0
  11253.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0 ; a0=Table base
  11254.   CMP.w   #5,_ParticleModeType ; Simple or complex?
  11255.   BEQ     _MGrabParticlesAndPlotAReMapComplex
  11256.   MOVEQ.l #0,d2 ; Init
  11257. _MGrabParticlesAndPlotAReMapLoop
  11258.     MOVE.l  (a2)+,a1 ; Get Ptr.l
  11259.     MOVE.b  (a1),d2 ; Get point
  11260.     MOVE.b  0(a0,d2.w),(a1) ; Plot SimpleReMap
  11261.     MOVE.b  d2,(a3)+ ; Grab particle
  11262.     SUBQ.l  #1,d1 ; Next pixel
  11263.     BGT     _MGrabParticlesAndPlotAReMapLoop
  11264.   MOVE.l  (a7)+,a3 ; Restore
  11265.   RTS;pop
  11266. _MGrabParticlesAndPlotAReMapComplex
  11267.   LSL.w   #8,d2 ; Make upper portion of offset
  11268.   AND.l   #$0000FF00,d2
  11269. _MGrabParticlesAndPlotAReMapComplexLoop
  11270.     MOVE.l  (a2)+,a1 ; Get Ptr.l
  11271.     MOVE.b  (a1),d2 ; Get point
  11272.     MOVE.b  0(a0,d2.l),(a1) ; Plot ReMap
  11273.     MOVE.b  d2,(a3)+ ; Grab point
  11274.     SUBQ.l  #1,d1 ; Next pixel
  11275.     BGT     _MGrabParticlesAndPlotAReMapComplexLoop
  11276.   MOVE.l  (a7)+,a3 ; Restore
  11277.   RTS
  11278.  
  11279. _MGrabParticlesAndPlotQ
  11280. ;Grab and Plot a list of pixels in a bitmap to specified or ink colour. List contains X.q,Y.q pairs, Buffer contains bytes
  11281.   CMP.w   #5,_ParticleModeType
  11282.   BEQ     _MGrabParticlesAndPlotQReMap
  11283.   CMP.w   #6,_ParticleModeType
  11284.   BEQ     _MGrabParticlesAndPlotQReMap
  11285.   MOVE.l  d0,a2 ; a2=List memory
  11286.   MOVE.l  a5,-(a7) ; Store
  11287.   MOVE.l  d2,a5 ; a5=Buffer mem
  11288.   MOVE.w  CurrentChunkyBitmap1,d0 ; Bitmap to plot in
  11289.   !GetBitmapObjectPtr ; Base in a0
  11290.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Data mem
  11291.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  11292.   BEQ     _MGrabParticlesAndPlotQSkip
  11293.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1
  11294. _MGrabParticlesAndPlotQSkip
  11295.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d7 ; Total bytes width
  11296.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  11297.   BNE     _MGrabParticlesAndPlotQClip
  11298.   MOVE.l  a1,d5 ; Store data mem
  11299.   CMP.w   #7,_ParticleModeType
  11300.   BEQ     _MGrabParticlesAndPlotQAddLoop
  11301. _MGrabParticlesAndPlotQLoop
  11302.     MOVE.l  d5,a1 ; Reset base address of dest
  11303.     ADD.w   (a2),a1 ; Get x
  11304.     MOVE.w  4(a2),d0 ; Get y
  11305.     MULU    d7,d0 ; Find y bytes
  11306.     ADD.l   d0,a1
  11307.     MOVE.b  (a1),(a5)+ ; Grab point
  11308.     MOVE.b  d3,(a1) ; Plot point
  11309.     ADD.w   #8,a2
  11310.     SUBQ.l  #1,d1 ; Next pixel
  11311.     BGT     _MGrabParticlesAndPlotQLoop
  11312.   MOVE.l  (a7)+,a5 ; Restore
  11313.   RTS;pop
  11314. _MGrabParticlesAndPlotQAddLoop
  11315.     MOVE.l  d5,a1 ; Reset base address of dest
  11316.     ADD.w   (a2),a1 ; Get x
  11317.     MOVE.w  4(a2),d0 ; Get y
  11318.     MULU    d7,d0 ; Find y bytes
  11319.     ADD.l   d0,a1
  11320.     MOVE.b  (a1),(a5)+ ; Grab point
  11321.     ADD.b   d3,(a1) ; Plot Add
  11322.     ADD.w   #8,a2
  11323.     SUBQ.l  #1,d1 ; Next pixel
  11324.     BGT     _MGrabParticlesAndPlotQAddLoop
  11325.   MOVE.l  (a7)+,a5 ; Restore
  11326.   RTS;pop
  11327. _MGrabParticlesAndPlotQClip
  11328. ;Only do the particles that are within the clip window
  11329.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d2 ; X1
  11330.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  11331.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  11332.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  11333.   ADD.w   d3,d5 ; X2 outside of window
  11334.   ADD.w   d4,d6 ; Y2 outside of window
  11335.   MOVE.l  a3,-(a7) ; Store
  11336.   MOVE.l  a1,a3 ; Store data mem
  11337.   CMP.w   #7,_ParticleModeType
  11338.   BEQ     _MGrabParticlesAndPlotQAddClipLoop
  11339. _MGrabParticlesAndPlotQClipLoop
  11340.     MOVE.l  a3,a1 ; Reset base address of dest
  11341.     MOVE.w  (a2),d0 ; Get x
  11342.     CMP.w   d2,d0 ; X<X1?
  11343.     BLT     _MGrabParticlesAndPlotQClipSkip
  11344.     CMP.w   d5,d0 ; X>=X2?
  11345.     BGE     _MGrabParticlesAndPlotQClipSkip
  11346.     ADD.w   d0,a1 ; Find x
  11347.     MOVE.w  4(a2),d0 ; Get y
  11348.     CMP.w   d4,d0 ; Y<Y1?
  11349.     BLT     _MGrabParticlesAndPlotQClipSkip
  11350.     CMP.w   d6,d0 ; Y>=Y2?
  11351.     BGE     _MGrabParticlesAndPlotQClipSkip
  11352.     MULU    d7,d0 ; Find y bytes
  11353.     ADD.l   d0,a1
  11354.     MOVE.b  (a1),(a5)+ ; Grab point
  11355.     MOVE.b  d3,(a1) ; Plot point
  11356.     ADD.w   #8,a2
  11357.     SUBQ.l  #1,d1 ; Next pixel
  11358.     BGT     _MGrabParticlesAndPlotQClipLoop
  11359.   MOVE.l  (a7)+,a3
  11360.   MOVE.l  (a7)+,a5
  11361.   RTS;pop
  11362. _MGrabParticlesAndPlotQClipSkip
  11363.     ADD.w   #8,a2 ; Mimic read
  11364.     ADD.w   #1,a5 ; Mimic grab
  11365.     SUBQ.l  #1,d1 ; Next pixel
  11366.     BGT     _MGrabParticlesAndPlotQClipLoop
  11367.   MOVE.l  (a7)+,a3
  11368.   MOVE.l  (a7)+,a5
  11369.   RTS;pop
  11370. _MGrabParticlesAndPlotQAddClipLoop
  11371.     MOVE.l  a3,a1 ; Reset base address of dest
  11372.     MOVE.w  (a2),d0 ; Get x
  11373.     CMP.w   d2,d0 ; X<X1?
  11374.     BLT     _MGrabParticlesAndPlotQAddClipSkip
  11375.     CMP.w   d5,d0 ; X>=X2?
  11376.     BGE     _MGrabParticlesAndPlotQAddClipSkip
  11377.     ADD.w   d0,a1 ; Find x
  11378.     MOVE.w  4(a2),d0 ; Get y
  11379.     CMP.w   d4,d0 ; Y<Y1?
  11380.     BLT     _MGrabParticlesAndPlotQAddClipSkip
  11381.     CMP.w   d6,d0 ; Y>=Y2?
  11382.     BGE     _MGrabParticlesAndPlotQAddClipSkip
  11383.     MULU    d7,d0 ; Find y bytes
  11384.     ADD.l   d0,a1
  11385.     MOVE.b  (a1),(a5)+ ; Grab point
  11386.     ADD.b   d3,(a1) ; Plot Add
  11387.     ADD.w   #8,a2
  11388.     SUBQ.l  #1,d1 ; Next pixel
  11389.     BGT     _MGrabParticlesAndPlotQAddClipLoop
  11390.   MOVE.l  (a7)+,a3
  11391.   MOVE.l  (a7)+,a5
  11392.   RTS;pop
  11393. _MGrabParticlesAndPlotQAddClipSkip
  11394.     ADD.w   #8,a2 ; Mimic read
  11395.     ADD.w   #1,a5 ; Mimic grab
  11396.     SUBQ.l  #1,d1 ; Next pixel
  11397.     BGT     _MGrabParticlesAndPlotQAddClipLoop
  11398.   MOVE.l  (a7)+,a3
  11399.   MOVE.l  (a7)+,a5
  11400.   RTS;pop
  11401. _MGrabParticlesAndPlotQReMap
  11402. ;Remap a list of X.w,Y.w particles in a bitmap, perhaps combining with specified colour. List contains X.w,Y.w pairs
  11403.   MOVE.l  a5,-(a7) ; Store
  11404.   MOVE.l  d2,a5 ; a5=Buffer mem
  11405.   MOVE.l  a3,-(a7) ; Store
  11406.   MOVE.l  d0,a2 ; a2=List memory
  11407.   MOVE.w  CurrentChunkyTable1,d0 ; Table to use
  11408.   !GetTableObjectPtr ; Base in a0
  11409.   MOVE.l  CTable_LMem-ChunkyTables(a0),a3 ; a3=Table base
  11410.   MOVE.w  CurrentChunkyBitmap1,d0 ; Bitmap to plot in
  11411.   !GetBitmapObjectPtr ; Base in a0
  11412.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Data mem
  11413.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  11414.   BEQ     _MGrabParticlesAndPlotQReMapSkip
  11415.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1
  11416. _MGrabParticlesAndPlotQReMapSkip
  11417.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d7 ; Total bytes width
  11418.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  11419.   BNE     _MGrabParticlesAndPlotQReMapClip
  11420.   MOVE.l  a1,d5 ; Store data mem
  11421.   CMP.w   #5,_ParticleModeType ; Simple or complex?
  11422.   BEQ     _MGrabParticlesAndPlotQReMapComplex
  11423.   MOVEQ.l #0,d2 ; Init
  11424. _MGrabParticlesAndPlotQReMapLoop
  11425.     MOVE.l  d5,a1 ; Reset base address of dest
  11426.     ADD.w   (a2),a1 ; Get x
  11427.     MOVE.w  4(a2),d0 ; Get y
  11428.     MULU    d7,d0 ; Find y bytes
  11429.     ADD.l   d0,a1
  11430.     MOVE.b  (a1),d2 ; Get point
  11431.     MOVE.b  0(a3,d2.w),(a1) ; Plot SimpleReMap
  11432.     MOVE.b  d2,(a5)+ ; Grab point
  11433.     ADD.w   #8,a2
  11434.     SUBQ.l  #1,d1 ; Next pixel
  11435.     BGT     _MGrabParticlesAndPlotQReMapLoop
  11436.   MOVE.l  (a7)+,a3 ; Restore
  11437.   MOVE.l  (a7)+,a5 ; Restore
  11438.   RTS;pop
  11439. _MGrabParticlesAndPlotQReMapComplex
  11440.   LSL.w   #8,d2 ; Make upper portion of offset
  11441.   AND.l   #$0000FF00,d2
  11442. _MGrabParticlesAndPlotQReMapComplexLoop
  11443.     MOVE.l  d5,a1 ; Reset base address of dest
  11444.     ADD.w   (a2),a1 ; Get x
  11445.     MOVE.w  4(a2),d0 ; Get y
  11446.     MULU    d7,d0 ; Find y bytes
  11447.     ADD.l   d0,a1
  11448.     MOVE.b  (a1),d2 ; Get point
  11449.     MOVE.b  0(a3,d2.l),(a1) ; Plot ReMap
  11450.     MOVE.b  d2,(a5)+ ; Grab point
  11451.     ADD.w   #8,a2
  11452.     SUBQ.l  #1,d1 ; Next pixel
  11453.     BGT     _MGrabParticlesAndPlotQReMapComplexLoop
  11454.   MOVE.l  (a7)+,a3 ; Restore
  11455.   MOVE.l  (a7)+,a5 ; Restore
  11456.   RTS;pop
  11457. _MGrabParticlesAndPlotQReMapClip
  11458. ;Only remap the particles that are within the clip window
  11459.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  11460.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  11461.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  11462.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  11463.   ADD.w   d3,d5 ; X2 outside of window
  11464.   ADD.w   d4,d6 ; Y2 outside of window
  11465.   MOVE.l  a4,-(a7) ; Store
  11466.   MOVE.l  a1,a4 ; Store data mem
  11467.   CMP.w   #5,_ParticleModeType ; Simple or complex?
  11468.   BEQ     _MGrabParticlesAndPlotQReMapClipComplex
  11469.   MOVEQ.l #0,d2 ; Init
  11470. _MGrabParticlesAndPlotQReMapClipLoop
  11471.     MOVE.l  a4,a1 ; Reset base address of dest
  11472.     MOVE.w  (a2),d0 ; Get x
  11473.     CMP.w   d3,d0 ; X<X1?
  11474.     BLT     _MGrabParticlesAndPlotQReMapClipSkip
  11475.     CMP.w   d5,d0 ; X>=X2?
  11476.     BGE     _MGrabParticlesAndPlotQReMapClipSkip
  11477.     ADD.w   d0,a1 ; Find x
  11478.     MOVE.w  4(a2),d0 ; Get y
  11479.     CMP.w   d4,d0 ; Y<Y1?
  11480.     BLT     _MGrabParticlesAndPlotQReMapClipSkip
  11481.     CMP.w   d6,d0 ; Y>=Y2?
  11482.     BGE     _MGrabParticlesAndPlotQReMapClipSkip
  11483.     MULU    d7,d0 ; Find y bytes
  11484.     ADD.l   d0,a1
  11485.     MOVE.b  (a1),d2 ; Get point
  11486.     MOVE.b  0(a3,d2.w),(a1) ; Plot SimpleReMap
  11487.     MOVE.b  d2,(a5)+ ; Grab point
  11488.     ADD.w   #8,a2
  11489.     SUBQ.l  #1,d1 ; Next pixel
  11490.     BGT     _MGrabParticlesAndPlotQReMapClipLoop
  11491.   MOVE.l  (a7)+,a4
  11492.   MOVE.l  (a7)+,a3
  11493.   MOVE.l  (a7)+,a5
  11494.   RTS;pop
  11495. _MGrabParticlesAndPlotQReMapClipSkip
  11496.     ADD.w   #8,a2 ; Mimic read
  11497.     ADD.w   #1,a5 ; Mimic grab
  11498.     SUBQ.l  #1,d1 ; Next pixel
  11499.     BGT     _MGrabParticlesAndPlotQReMapClipLoop
  11500.   MOVE.l  (a7)+,a4
  11501.   MOVE.l  (a7)+,a3
  11502.   MOVE.l  (a7)+,a5
  11503.   RTS;pop
  11504. _MGrabParticlesAndPlotQReMapClipComplex
  11505.   LSL.w   #8,d2 ; Make upper portion of offset
  11506.   AND.l   #$0000FF00,d2
  11507. _MGrabParticlesAndPlotQReMapClipComplexLoop
  11508.     MOVE.l  a4,a1 ; Reset base address of dest
  11509.     MOVE.w  (a2),d0 ; Get x
  11510.     CMP.w   d3,d0 ; X<X1?
  11511.     BLT     _MGrabParticlesAndPlotQReMapClipComplexSkip
  11512.     CMP.w   d5,d0 ; X>=X2?
  11513.     BGE     _MGrabParticlesAndPlotQReMapClipComplexSkip
  11514.     ADD.w   d0,a1 ; Find x
  11515.     MOVE.w  4(a2),d0 ; Get y
  11516.     CMP.w   d4,d0 ; Y<Y1?
  11517.     BLT     _MGrabParticlesAndPlotQReMapClipComplexSkip
  11518.     CMP.w   d6,d0 ; Y>=Y2?
  11519.     BGE     _MGrabParticlesAndPlotQReMapClipComplexSkip
  11520.     MULU    d7,d0 ; Find y bytes
  11521.     ADD.l   d0,a1
  11522.     MOVE.b  (a1),d2 ; Get point
  11523.     MOVE.b  0(a3,d2.l),(a1) ; Plot ReMap
  11524.     MOVE.b  d2,(a5)+ ; Grab point
  11525.     ADD.w   #8,a2
  11526.     SUBQ.l  #1,d1 ; Next pixel
  11527.     BGT     _MGrabParticlesAndPlotQReMapClipComplexLoop
  11528.   MOVE.l  (a7)+,a4
  11529.   MOVE.l  (a7)+,a3
  11530.   MOVE.l  (a7)+,a5
  11531.   RTS;pop
  11532. _MGrabParticlesAndPlotQReMapClipComplexSkip
  11533.     ADD.w   #8,a2 ; Mimic read
  11534.     ADD.w   #1,a5 ; Mimic grab
  11535.     SUBQ.l  #1,d1 ; Next pixel
  11536.     BGT     _MGrabParticlesAndPlotQReMapClipComplexLoop
  11537.   MOVE.l  (a7)+,a4
  11538.   MOVE.l  (a7)+,a3
  11539.   MOVE.l  (a7)+,a5
  11540.   RTS
  11541.  
  11542. ;*************************************************************************************
  11543.  
  11544. _MAddToParticlesShort
  11545.   MOVEQ.l #0,d3 ; No second list
  11546. _MAddToParticles
  11547. ;Add X.w increments to X.w coords, and Y.w increments to Y.w coords, in particle list
  11548.   TST.b   _ParticleFormat ; What format?
  11549.   BLT     _MAddToParticlesQ ; Data is in X.q,Y.q format
  11550.   BGT     _MAddToParticlesA ; Data is in Ptr.l format
  11551.   ;Data is in X.w,Y.w format
  11552.   MOVE.l  d0,a2 ; Particle list
  11553.   MOVE.l  d2,a1 ; Increment list A
  11554.   MOVE.w  CurrentChunkyBitmap1,d0
  11555.   !GetBitmapObjectPtr ; Base in a0
  11556.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  11557.   BNE     _MAddToParticlesClip
  11558.   TST.l   d3 ; Two adds?
  11559.   BNE     _MAddToParticles2
  11560. _MAddToParticlesLoop
  11561.     MOVE.w  (a1)+,d3 ; Read
  11562.     MOVE.w  (a1)+,d4 ; Read
  11563.     ADD.w   d3,(a2)+ ; X.w+XAdder.w
  11564.     ADD.w   d4,(a2)+ ; Y.w+YAdder.w
  11565.     SUBQ.l  #1,d1 ; Next pixel
  11566.     BGT     _MAddToParticlesLoop
  11567.   RTS
  11568. _MAddToParticles2
  11569.   MOVE.l  a3,-(a7) ; Store
  11570.   MOVE.l  d3,a3 ; a3=Increment list B
  11571. _MAddToParticles2Loop
  11572.     MOVE.w  (a2),d3 ; Read list
  11573.     MOVE.w  2(a2),d4 ; Read list
  11574.     ADD.w   (a1)+,d3 ; X.w+XAdderA.w
  11575.     ADD.w   (a1)+,d4 ; Y.w+YAdderA.w
  11576.     ADD.w   (a3)+,d3 ; X.w+XAdderB.w
  11577.     ADD.w   (a3)+,d4 ; Y.w+YAdderB.w
  11578.     MOVE.w  d3,(a2)+ ; Write
  11579.     MOVE.w  d4,(a2)+ ; Write
  11580.     SUBQ.l  #1,d1 ; Next pixel
  11581.     BGT     _MAddToParticles2Loop
  11582.   MOVE.l  (a7)+,a3 ; Restore
  11583.   RTS
  11584. _MAddToParticlesClip
  11585. ;Only move the particles that are within the clip window
  11586.   TST.l   d3 ; Two adds?
  11587.   BNE     _MAddToParticlesClip2
  11588.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  11589.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  11590.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  11591.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  11592.   ADD.w   d3,d5 ; X2 outside of window
  11593.   ADD.w   d4,d6 ; Y2 outside of window
  11594.   MOVEQ.l #4,d7 ; Skip value
  11595. _MAddToParticlesClipLoop
  11596.     MOVE.w  (a2),d0 ; Get x
  11597.     CMP.w   d3,d0 ; X<X1?
  11598.     BLT     _MAddToParticlesClipSkip
  11599.     CMP.w   d5,d0 ; X>=X2?
  11600.     BGE     _MAddToParticlesClipSkip
  11601.     MOVE.w  2(a2),d2 ; Get y
  11602.     CMP.w   d4,d2 ; Y<Y1?
  11603.     BLT     _MAddToParticlesClipSkip
  11604.     CMP.w   d6,d2 ; Y>=Y2?
  11605.     BGE     _MAddToParticlesClipSkip
  11606.     ADD.w   (a1)+,d0 ; X.w+XAdder.w
  11607.     ADD.w   (a1)+,d2 ; Y.w+YAdder.w
  11608.     MOVE.w  d0,(a2)+ ; Write
  11609.     MOVE.w  d2,(a2)+ ; Write
  11610.     SUBQ.l  #1,d1 ; Next pixel
  11611.     BGT     _MAddToParticlesClipLoop
  11612.   RTS;pop
  11613. _MAddToParticlesClipSkip
  11614.     ADD.w   d7,a1
  11615.     ADD.w   d7,a2
  11616.     SUBQ.l  #1,d1 ; Next pixel
  11617.     BGT     _MAddToParticlesClipLoop
  11618.   RTS;pop
  11619. _MAddToParticlesClip2
  11620.   MOVE.l  a3,-(a7) ; Store
  11621.   MOVE.l  d3,a3 ; a3=Increment list B
  11622.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  11623.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  11624.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  11625.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  11626.   ADD.w   d3,d5 ; X2 outside of window
  11627.   ADD.w   d4,d6 ; Y2 outside of window
  11628.   MOVEQ.l #4,d7 ; Skip value
  11629. _MAddToParticlesClip2Loop
  11630.     MOVE.w  (a2),d0 ; Get x
  11631.     CMP.w   d3,d0 ; X<X1?
  11632.     BLT     _MAddToParticlesClip2Skip
  11633.     CMP.w   d5,d0 ; X>=X2?
  11634.     BGE     _MAddToParticlesClip2Skip
  11635.     MOVE.w  2(a2),d2 ; Get y
  11636.     CMP.w   d4,d2 ; Y<Y1?
  11637.     BLT     _MAddToParticlesClip2Skip
  11638.     CMP.w   d6,d2 ; Y>=Y2?
  11639.     BGE     _MAddToParticlesClip2Skip
  11640.     ADD.w   (a1)+,d0 ; X.w+XAdderA.w
  11641.     ADD.w   (a1)+,d2 ; Y.w+YAdderA.w
  11642.     ADD.w   (a3)+,d0 ; X.w+XAdderB.w
  11643.     ADD.w   (a3)+,d2 ; Y.w+YAdderB.w
  11644.     MOVE.w  d0,(a2)+ ; Write
  11645.     MOVE.w  d2,(a2)+ ; Write
  11646.     SUBQ.l  #1,d1 ; Next pixel
  11647.     BGT     _MAddToParticlesClip2Loop
  11648.   MOVE.l  (a7)+,a3 ; Restore
  11649.   RTS;pop
  11650. _MAddToParticlesClip2Skip
  11651.     ADD.w   d7,a1
  11652.     ADD.w   d7,a3
  11653.     ADD.w   d7,a2
  11654.     SUBQ.l  #1,d1 ; Next pixel
  11655.     BGT     _MAddToParticlesClip2Loop
  11656.   MOVE.l  (a7)+,a3 ; Restore
  11657.   RTS
  11658.  
  11659. _MAddToParticlesA
  11660. ;Add Ptr.l increment to Ptr.l position in particle list. No clipping!
  11661.   MOVE.l  d0,a2 ; Particle list
  11662.   MOVE.l  d2,a1 ; Increment list
  11663.   MOVE.l  d1,d7 ; Copy counter
  11664.   TST.l   d3 ; Second list?
  11665.   BNE     _MAddToParticlesA2
  11666.   AND.b   #$FC,d7 ; Multiples of 4
  11667.   BEQ     _MAddToParticlesASkip
  11668. _MAddToParticlesA4Loop
  11669.     MOVE.l  (a1)+,d3
  11670.     MOVE.l  (a1)+,d4
  11671.     MOVE.l  (a1)+,d5
  11672.     MOVE.l  (a1)+,d6
  11673.     ADD.l   d3,(a2)+ ; Ptr.l+PtrAdder.l
  11674.     ADD.l   d4,(a2)+ ; Ptr.l+PtrAdder.l
  11675.     ADD.l   d5,(a2)+ ; Ptr.l+PtrAdder.l
  11676.     ADD.l   d6,(a2)+ ; Ptr.l+PtrAdder.l
  11677.     SUBQ.l  #4,d7 ; Next pixels
  11678.     BGT     _MAddToParticlesA4Loop
  11679. _MAddToParticlesASkip
  11680.   AND.l   #$00000003,d1 ; Counter leftover entries
  11681.   BEQ     _MAddToParticlesASkip2
  11682. _MAddToParticlesA1Loop
  11683.     MOVE.l  (a1)+,d3
  11684.     ADD.l   d3,(a2)+ ; Ptr.l+PtrAdder.l
  11685.     SUBQ.l  #1,d1 ; Next pixel
  11686.     BGT     _MAddToParticlesA1Loop
  11687. _MAddToParticlesASkip2
  11688.   RTS
  11689. _MAddToParticlesA2
  11690.   MOVE.l  a3,-(a7) ; Store
  11691.   MOVE.l  d3,a3 ; Increment list B
  11692.   AND.b   #$FC,d7 ; Multiples of 4
  11693.   BEQ     _MAddToParticlesA2Skip
  11694. _MAddToParticlesA24Loop
  11695.     MOVE.l  (a2),d3  ; Read
  11696.     MOVE.l  4(a2),d4 ; Read
  11697.     MOVE.l  8(a2),d5 ; Read
  11698.     MOVE.l  12(a2),d6; Read
  11699.     ADD.l   (a1)+,d3 ; Ptr.l+PtrAdderA.l
  11700.     ADD.l   (a1)+,d4 ; Ptr.l+PtrAdderA.l
  11701.     ADD.l   (a1)+,d5 ; Ptr.l+PtrAdderA.l
  11702.     ADD.l   (a1)+,d6 ; Ptr.l+PtrAdderA.l
  11703.     ADD.l   (a3)+,d3 ; Ptr.l+PtrAdderB.l
  11704.     ADD.l   (a3)+,d4 ; Ptr.l+PtrAdderB.l
  11705.     ADD.l   (a3)+,d5 ; Ptr.l+PtrAdderB.l
  11706.     ADD.l   (a3)+,d6 ; Ptr.l+PtrAdderB.l
  11707.     MOVE.l  d3,(a2)+ ; Write
  11708.     MOVE.l  d4,(a2)+ ; Write
  11709.     MOVE.l  d5,(a2)+ ; Write
  11710.     MOVE.l  d6,(a2)+ ; Write
  11711.     SUBQ.l  #4,d7 ; Next pixels
  11712.     BGT     _MAddToParticlesA24Loop
  11713. _MAddToParticlesA2Skip
  11714.   AND.l   #$00000003,d1 ; Counter leftover entries
  11715.   BEQ     _MAddToParticlesA2Skip2
  11716. _MAddToParticlesA21Loop
  11717.     MOVE.l  (a2),d3  ; Read
  11718.     ADD.l   (a1)+,d3 ; Ptr.l+PtrAdderA.l
  11719.     ADD.l   (a3)+,d3 ; Ptr.l+PtrAdderB.l
  11720.     MOVE.l  d3,(a2)+ ; Write
  11721.     SUBQ.l  #1,d1 ; Next pixel
  11722.     BGT     _MAddToParticlesA21Loop
  11723. _MAddToParticlesA2Skip2
  11724.   MOVE.l  (a7)+,a3 ; Restore
  11725.   RTS
  11726.  
  11727. _MAddToParticlesQ
  11728. ;Add X.q increments to X.q coords, and Y.q increments to Y.q coords, in particle list
  11729.   MOVE.l  d0,a2 ; Particle list
  11730.   MOVE.l  d2,a1 ; Increment list
  11731.   MOVE.w  CurrentChunkyBitmap1,d0
  11732.   !GetBitmapObjectPtr ; Base in a0
  11733.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  11734.   BNE     _MAddToParticlesQClip
  11735.   TST.l   d3 ; Second list?
  11736.   BNE     _MAddToParticlesQ2
  11737. _MAddToParticlesQLoop
  11738.     MOVE.l  (a1)+,d3 ; Read
  11739.     MOVE.l  (a1)+,d4 ; Read
  11740.     ADD.l   d3,(a2)+ ; X.q+XAdder.q
  11741.     ADD.l   d4,(a2)+ ; Y.q+YAdder.q
  11742.     SUBQ.l  #1,d1 ; Next pixel
  11743.     BGT     _MAddToParticlesQLoop
  11744.   RTS
  11745. _MAddToParticlesQ2
  11746.   MOVE.l  a3,-(a7) ; Store
  11747.   MOVE.l  d3,a3 ; a3=Second list
  11748. _MAddToParticlesQ2Loop
  11749.     MOVE.l  (a2),d3  ; Read
  11750.     MOVE.l  4(a2),d4 ; Read
  11751.     ADD.l   (a1)+,d3 ; X.q+XAdderA.q
  11752.     ADD.l   (a1)+,d4 ; Y.q+YAdderA.q
  11753.     ADD.l   (a3)+,d3 ; X.q+XAdderA.q
  11754.     ADD.l   (a3)+,d4 ; Y.q+YAdderB.q
  11755.     MOVE.l  d3,(a2)+ ; Write
  11756.     MOVE.l  d4,(a2)+ ; Write
  11757.     SUBQ.l  #1,d1 ; Next pixel
  11758.     BGT     _MAddToParticlesQ2Loop
  11759.   MOVE.l  (a7)+,a3 ; Restore
  11760.   RTS
  11761. _MAddToParticlesQClip
  11762. ;Only move the particles that are within the clip window
  11763.   TST.l   d3 ; Two lists?
  11764.   BNE     _MAddToParticlesQClip2
  11765.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  11766.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  11767.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  11768.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  11769.   ADD.w   d3,d5 ; X2 outside of window
  11770.   ADD.w   d4,d6 ; Y2 outside of window
  11771.   MOVEQ.l #8,d7 ; Skip value
  11772. _MAddToParticlesQClipLoop
  11773.     MOVE.w  (a2),d0 ; Get x
  11774.     CMP.w   d3,d0 ; X<X1?
  11775.     BLT     _MAddToParticlesQClipSkip
  11776.     CMP.w   d5,d0 ; X>=X2?
  11777.     BGE     _MAddToParticlesQClipSkip
  11778.     MOVE.w  4(a2),d2 ; Get y
  11779.     CMP.w   d4,d2 ; Y<Y1?
  11780.     BLT     _MAddToParticlesQClipSkip
  11781.     CMP.w   d6,d2 ; Y>=Y2?
  11782.     BGE     _MAddToParticlesQClipSkip
  11783.     SWAP    d0 ; Make integer portion of x
  11784.     SWAP    d2 ; Make integer portion of y
  11785.     MOVE.w  2(a2),d0 ; Get decimal portion of x
  11786.     MOVE.w  6(a2),d2 ; Get decimal portion of y
  11787.     ADD.l   (a1)+,d0 ; X.q=XAdder.q
  11788.     ADD.l   (a1)+,d2 ; Y.q+YAdder.q
  11789.     MOVE.l  d0,(a2)+ ; Write
  11790.     MOVE.l  d2,(a2)+ ; Write
  11791.     SUBQ.l  #1,d1 ; Next pixel
  11792.     BGT     _MAddToParticlesQClipLoop
  11793.   RTS;pop
  11794. _MAddToParticlesQClipSkip
  11795.     ADD.w   d7,a1
  11796.     ADD.w   d7,a2
  11797.     SUBQ.l  #1,d1 ; Next pixel
  11798.     BGT     _MAddToParticlesQClipLoop
  11799.   RTS
  11800. _MAddToParticlesQClip2
  11801.   MOVE.l  a3,-(a7) ; Store
  11802.   MOVE.l  d3,a3 ; a3=Second list
  11803.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  11804.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  11805.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  11806.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  11807.   ADD.w   d3,d5 ; X2 outside of window
  11808.   ADD.w   d4,d6 ; Y2 outside of window
  11809.   MOVEQ.l #8,d7 ; Skip value
  11810. _MAddToParticlesQClip2Loop
  11811.     MOVE.w  (a2),d0 ; Get x
  11812.     CMP.w   d3,d0 ; X<X1?
  11813.     BLT     _MAddToParticlesQClip2Skip
  11814.     CMP.w   d5,d0 ; X>=X2?
  11815.     BGE     _MAddToParticlesQClip2Skip
  11816.     MOVE.w  4(a2),d2 ; Get y
  11817.     CMP.w   d4,d2 ; Y<Y1?
  11818.     BLT     _MAddToParticlesQClip2Skip
  11819.     CMP.w   d6,d2 ; Y>=Y2?
  11820.     BGE     _MAddToParticlesQClip2Skip
  11821.     SWAP    d0 ; Make integer portion of x
  11822.     SWAP    d2 ; Make integer portion of y
  11823.     MOVE.w  2(a2),d0 ; Get decimal portion of x
  11824.     MOVE.w  6(a2),d0 ; Get decimal portion of y
  11825.     ADD.l   (a1)+,d0 ; X.q+XAdderA.q
  11826.     ADD.l   (a1)+,d2 ; Y.q+YAdderA.q
  11827.     ADD.l   (a3)+,d0 ; X.q+XAdderB.q
  11828.     ADD.l   (a3)+,d2 ; Y.q+YAdderB.q
  11829.     MOVE.l  d0,(a2)+ ; Write
  11830.     MOVE.l  d2,(a2)+ ; Write
  11831.     SUBQ.l  #1,d1 ; Next pixel
  11832.     BGT     _MAddToParticlesQClip2Loop
  11833.   MOVE.l  (a7)+,a3 ; Restore
  11834.   RTS;pop
  11835. _MAddToParticlesQClip2Skip
  11836.     ADD.w   d7,a1
  11837.     ADD.w   d7,a2
  11838.     ADD.w   d7,a3
  11839.     SUBQ.l  #1,d1 ; Next pixel
  11840.     BGT     _MAddToParticlesQClip2Loop
  11841.   MOVE.l  (a7)+,a3 ; Restore
  11842.   RTS
  11843.  
  11844. ;*************************************************************************************
  11845.  
  11846. _MWrapParticles
  11847. ;Wrap X.w,Y.w particles around the edges of the bitmap. Particles reappear at opposite edge to which they left
  11848.   TST.b   _ParticleFormat ; What format?
  11849.   BLT     _MWrapParticlesQ ; Data is in X.q,Y.q format
  11850.   BGT     _MWrapParticlesA ; Data is in Ptr.l format
  11851.   ;Data is in X.w,Y.w format
  11852.   MOVE.l  d0,a1 ; Coordinate list
  11853.   MOVE.w  CurrentChunkyBitmap1,d0
  11854.   !GetBitmapObjectPtr ; Base in a0
  11855.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  11856.   BNE     _MWrapParticlesClip
  11857.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d5 ; Width X2
  11858.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d6 ; Height Y2
  11859. _MWrapParticlesLoop
  11860.     MOVE.w  (a1),d3 ; Read, X<0?
  11861.     BGE     _MWrapParticlesSkip1
  11862.     ADD.w   d5,d3 ; X+Width
  11863.     MOVE.w  2(a1),d4 ; Read, Y<0?
  11864.     BGE     _MWrapParticlesSkip3
  11865.     ADD.w   d6,d4 ; Y+Height
  11866.     MOVE.w  d3,(a1)+ ; Write X
  11867.     MOVE.w  d4,(a1)+ ; Write Y
  11868.     SUBQ.l  #1,d1 ; Next pixel
  11869.     BGT     _MWrapParticlesLoop
  11870.   RTS
  11871. _MWrapParticlesSkip1
  11872.     CMP.w   d5,d3 ; X>=X2?
  11873.     BLT     _MWrapParticlesSkip2
  11874.     SUB.w   d5,d3 ; X-Width
  11875. _MWrapParticlesSkip2
  11876.     MOVE.w  2(a1),d4 ; Read, Y<0?
  11877.     BGE     _MWrapParticlesSkip3
  11878.     ADD.w   d6,d4 ; Y+Height
  11879.     MOVE.w  d3,(a1)+ ; Write X
  11880.     MOVE.w  d4,(a1)+ ; Write Y
  11881.     SUBQ.l  #1,d1 ; Next pixel
  11882.     BGT     _MWrapParticlesLoop
  11883.   RTS
  11884. _MWrapParticlesSkip3
  11885.     CMP.w   d6,d4 ; Y>=Y2?
  11886.     BLT     _MWrapParticlesSkip4
  11887.     SUB.w   d6,d4 ; Y-Height
  11888.     MOVE.w  d3,(a1)+ ; Write X
  11889.     MOVE.w  d4,(a1)+ ; Write Y
  11890.     SUBQ.l  #1,d1 ; Next pixel
  11891.     BGT     _MWrapParticlesLoop
  11892.   RTS
  11893. _MWrapParticlesSkip4
  11894.     MOVE.w  d3,(a1) ; Write X
  11895.     ADD.w   #4,a1 ; Skip Ywrite
  11896.     SUBQ.l  #1,d1 ; Next pixel
  11897.     BGT     _MWrapParticlesLoop
  11898.   RTS
  11899. _MWrapParticlesClip
  11900. ;Only wrap the particles that are outside of the clip window
  11901.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  11902.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  11903.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  11904.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  11905.   MOVE.w  d5,d0 ; Store width
  11906.   MOVE.w  d6,d2 ; Store height
  11907.   ADD.w   d3,d5 ; X2 outside of window
  11908.   ADD.w   d4,d6 ; Y2 outside of window
  11909. _MWrapParticlesClipLoop
  11910.     MOVE.w  (a1),d7 ; Get x
  11911.     CMP.w   d3,d7 ; X<X1?
  11912.     BLT     _MWrapParticlesClipSkip1
  11913.     CMP.w   d5,d7 ; X>=X2?
  11914.     BGE     _MWrapParticlesClipSkip2
  11915.     MOVE.w  2(a1),d7 ; Get y
  11916.     CMP.w   d4,d7 ; Y<Y1?
  11917.     BLT     _MWrapParticlesClipSkip3
  11918.     CMP.w   d6,d7 ; Y>=Y2?
  11919.     BGE     _MWrapParticlesClipSkip4
  11920.     ADD.w   #4,a1
  11921.     SUBQ.l  #1,d1 ; Next pixel
  11922.     BGT     _MWrapParticlesClipLoop
  11923.   RTS
  11924. _MWrapParticlesClipSkip1
  11925.     ADD.w   d0,d7 ; X+Width
  11926.     MOVE.w  d7,(a1) ; Write X
  11927.     MOVE.w  2(a1),d7 ; Get y
  11928.     CMP.w   d4,d7 ; Y<Y1?
  11929.     BLT     _MWrapParticlesClipSkip3
  11930.     CMP.w   d6,d7 ; Y>=Y2?
  11931.     BGE     _MWrapParticlesClipSkip4
  11932.     ADD.w   #4,a1
  11933.     SUBQ.l  #1,d1 ; Next pixel
  11934.     BGE     _MWrapParticlesClipLoop
  11935.   RTS
  11936. _MWrapParticlesClipSkip2
  11937.     SUB.w   d0,d7 ; X-Width
  11938.     MOVE.w  d7,(a1) ; Write X
  11939.     MOVE.w  2(a1),d7 ; Get y
  11940.     CMP.w   d4,d7 ; Y<Y1?
  11941.     BLT     _MWrapParticlesClipSkip3
  11942.     CMP.w   d6,d7 ; Y>=Y2?
  11943.     BGE     _MWrapParticlesClipSkip4
  11944.     ADD.w   #4,a1
  11945.     SUBQ.l  #1,d1 ; Next pixel
  11946.     BGE     _MWrapParticlesClipLoop
  11947.   RTS
  11948. _MWrapParticlesClipSkip3
  11949.     ADD.w   d2,d7 ; Y+Height
  11950.     MOVE.w  d7,2(a1) ; Write Y
  11951.     ADD.w   #4,a1
  11952.     SUBQ.l  #1,d1 ; Next pixel
  11953.     BGE     _MWrapParticlesClipLoop
  11954.   RTS
  11955. _MWrapParticlesClipSkip4
  11956.     SUB.w   d2,d7 ; Y-Height
  11957.     MOVE.w  d7,2(a1) ; Write Y
  11958.     ADD.w   #4,a1
  11959.     SUBQ.l  #1,d1 ; Next pixel
  11960.     BGE     _MWrapParticlesClipLoop
  11961.   RTS
  11962.  
  11963. _MWrapParticlesA
  11964. ;Wrap Ptr.l particles around the higher and lower bounds of the bitmap. Particles reappear at opposite side to which they left
  11965.   MOVE.l  d0,a1 ; Particle list
  11966.   MOVE.w  CurrentChunkyBitmap1,d0
  11967.   !GetBitmapObjectPtr ; Base in a0
  11968.   MOVE.l  CRsrc_Data-ChunkyResources(a0),d5 ; Base
  11969.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  11970.   BEQ     _MWrapParticlesANoWrap
  11971.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),d5
  11972. _MWrapParticlesANoWrap
  11973.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  11974.   BNE     _MWrapParticlesAClip
  11975.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d6 ; Get total width
  11976.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d3 ; Get height
  11977.   MULU    d3,d6 ; Total bytes
  11978.   MOVE.l  d6,d4 ; Store
  11979.   ADD.l   d5,d6 ; d6=Highest address (1 past)
  11980. _MWrapParticlesALoop
  11981.     MOVE.l  (a1),d3 ; Get long
  11982.     CMP.l   d5,d3 ; Lower?
  11983.     BLT     _MWrapParticlesASkip1
  11984.     CMP.l   d6,d3 ; Higher or equal?
  11985.     BGE     _MWrapParticlesASkip2
  11986.     ADD.w   #4,a1
  11987.     SUBQ.l  #1,d1 ; Next pixel
  11988.     BGT     _MWrapParticlesALoop
  11989.   RTS
  11990. _MWrapParticlesASkip1
  11991.     ADD.l   d4,d3 ; Address+Bytes
  11992.     MOVE.l  d3,(a1)+ ; Write address
  11993.     SUBQ.l  #1,d1 ; Next pixel
  11994.     BGT     _MWrapParticlesALoop
  11995.   RTS
  11996. _MWrapParticlesASkip2
  11997.     SUB.l   d4,d3 ; Address-Bytes
  11998.     MOVE.l  d3,(a1)+ ; Write address
  11999.     SUBQ.l  #1,d1 ; Next pixel
  12000.     BGT     _MWrapParticlesALoop
  12001.   RTS
  12002. _MWrapParticlesAClip
  12003. ;Only wrap the particles that are within clip window bounds
  12004.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d2 ; temp
  12005.   MOVE.w  d2,d6 ; Get width
  12006.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d3 ; Get height
  12007.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d4 ; temp
  12008.   ADD.w   d4,d6 ; Total width
  12009.   MULU    d3,d6 ; Total bytes
  12010.   EXT.l   d4
  12011.   SUB.l   d4,d6 ; For end
  12012.   MOVE.w  CRsrc_ClipLMod-ChunkyResources(a0),d4
  12013.   EXT.l   d4
  12014.   SUB.l   d4,d6 ; For end
  12015.   MOVE.l  d6,d4 ; Store
  12016.   ADD.l   CRsrc_ClipBytes-ChunkyResources(a0),d5 ; Lowest address
  12017.   ADD.l   d5,d6 ; Highest address (1 past)
  12018. _MWrapParticlesAClipLoop
  12019.     MOVE.l  (a1),d3 ; Get long
  12020.     CMP.l   d5,d3 ; Lower?
  12021.     BLT     _MWrapParticlesAClipSkip1
  12022.     CMP.l   d6,d3 ; Higher or equal?
  12023.     BGE     _MWrapParticlesAClipSkip2
  12024.     ADD.w   #4,a1
  12025.     SUBQ.l  #1,d1 ; Next pixel
  12026.     BGT     _MWrapParticlesAClipLoop
  12027.   RTS
  12028. _MWrapParticlesAClipSkip1
  12029.     ADD.l   d4,d3 ; Address+Bytes
  12030.     MOVE.l  d3,(a1)+ ; Write address
  12031.     SUBQ.l  #1,d1 ; Next pixel
  12032.     BGT     _MWrapParticlesAClipLoop
  12033.   RTS
  12034. _MWrapParticlesAClipSkip2
  12035.     SUB.l   d4,d3 ; Address-Bytes
  12036.     MOVE.l  d3,(a1)+ ; Write address
  12037.     SUBQ.l  #1,d1 ; Next pixel
  12038.     BGT     _MWrapParticlesAClipLoop
  12039.   RTS
  12040.  
  12041. _MWrapParticlesQ
  12042. ;Wrap X.q,Y.q particles around the edges of the bitmap. Particles reappear at opposite edge to which they left
  12043.   MOVE.l  d0,a1 ; Coordinate list
  12044.   MOVE.w  CurrentChunkyBitmap1,d0
  12045.   !GetBitmapObjectPtr ; Base in a0
  12046.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  12047.   BNE     _MWrapParticlesQClip
  12048.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d5 ; Width X2
  12049.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d6 ; Height Y2
  12050. _MWrapParticlesQLoop
  12051.     MOVE.w  (a1),d3 ; Read, X<0?
  12052.     BGE     _MWrapParticlesQSkip1
  12053.     ADD.w   d5,d3 ; X+Width
  12054.     MOVE.w  4(a1),d4 ; Read, Y<0?
  12055.     BGE     _MWrapParticlesQSkip3
  12056.     ADD.w   d6,d4 ; Y+Height
  12057.     MOVE.w  d3,(a1) ; Write X
  12058.     MOVE.w  d4,4(a1) ; Write Y
  12059.     ADD.w   #8,a1
  12060.     SUBQ.l  #1,d1 ; Next pixel
  12061.     BGT     _MWrapParticlesQLoop
  12062.   RTS
  12063. _MWrapParticlesQSkip1
  12064.     CMP.w   d5,d3 ; X>=X2?
  12065.     BLT     _MWrapParticlesQSkip2
  12066.     SUB.w   d5,d3 ; X-Width
  12067. _MWrapParticlesQSkip2
  12068.     MOVE.w  4(a1),d4 ; Read, Y<0?
  12069.     BGE     _MWrapParticlesQSkip3
  12070.     ADD.w   d6,d4 ; Y+Height
  12071.     MOVE.w  d3,(a1) ; Write X
  12072.     MOVE.w  d4,4(a1) ; Write Y
  12073.     ADD.w   #8,a1
  12074.     SUBQ.l  #1,d1 ; Next pixel
  12075.     BGT     _MWrapParticlesQLoop
  12076.   RTS
  12077. _MWrapParticlesQSkip3
  12078.     CMP.w   d6,d4 ; Y>=Y2?
  12079.     BLT     _MWrapParticlesQSkip4
  12080.     SUB.w   d6,d4 ; Y-Height
  12081.     MOVE.w  d3,(a1) ; Write X
  12082.     MOVE.w  d4,4(a1) ; Write Y
  12083.     ADD.w   #8,a1
  12084.     SUBQ.l  #1,d1 ; Next pixel
  12085.     BGT     _MWrapParticlesQLoop
  12086.   RTS
  12087. _MWrapParticlesQSkip4
  12088.     MOVE.w  d3,(a1) ; Write X
  12089.     ADD.w   #8,a1 ; Skip Ywrite
  12090.     SUBQ.l  #1,d1 ; Next pixel
  12091.     BGT     _MWrapParticlesQLoop
  12092.   RTS
  12093. _MWrapParticlesQClip
  12094. ;Only wrap the particles that are outside of the clip window
  12095.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  12096.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  12097.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  12098.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  12099.   MOVE.w  d5,d0 ; Store width
  12100.   MOVE.w  d6,d2 ; Store height
  12101.   ADD.w   d3,d5 ; X2 outside of window
  12102.   ADD.w   d4,d6 ; Y2 outside of window
  12103. _MWrapParticlesQClipLoop
  12104.     MOVE.w  (a1),d7 ; Get x
  12105.     CMP.w   d3,d7 ; X<X1?
  12106.     BLT     _MWrapParticlesQClipSkip1
  12107.     CMP.w   d5,d7 ; X>=X2?
  12108.     BGE     _MWrapParticlesQClipSkip2
  12109.     MOVE.w  4(a1),d7 ; Get y
  12110.     CMP.w   d4,d7 ; Y<Y1?
  12111.     BLT     _MWrapParticlesQClipSkip3
  12112.     CMP.w   d6,d7 ; Y>=Y2?
  12113.     BGE     _MWrapParticlesQClipSkip4
  12114.     ADD.w   #8,a1
  12115.     SUBQ.l  #1,d1 ; Next pixel
  12116.     BGT     _MWrapParticlesQClipLoop
  12117.   RTS
  12118. _MWrapParticlesQClipSkip1
  12119.     ADD.w   d0,d7 ; X+Width
  12120.     MOVE.w  d7,(a1) ; Write X
  12121.     MOVE.w  4(a1),d7 ; Get y
  12122.     CMP.w   d4,d7 ; Y<Y1?
  12123.     BLT     _MWrapParticlesQClipSkip3
  12124.     CMP.w   d6,d7 ; Y>=Y2?
  12125.     BGE     _MWrapParticlesQClipSkip4
  12126.     ADD.w   #8,a1
  12127.     SUBQ.l  #1,d1 ; Next pixel
  12128.     BGE     _MWrapParticlesQClipLoop
  12129.   RTS
  12130. _MWrapParticlesQClipSkip2
  12131.     SUB.w   d0,d7 ; X-Width
  12132.     MOVE.w  d7,(a1) ; Write X
  12133.     MOVE.w  4(a1),d7 ; Get y
  12134.     CMP.w   d4,d7 ; Y<Y1?
  12135.     BLT     _MWrapParticlesQClipSkip3
  12136.     CMP.w   d6,d7 ; Y>=Y2?
  12137.     BGE     _MWrapParticlesQClipSkip4
  12138.     ADD.w   #8,a1
  12139.     SUBQ.l  #1,d1 ; Next pixel
  12140.     BGE     _MWrapParticlesQClipLoop
  12141.   RTS
  12142. _MWrapParticlesQClipSkip3
  12143.     ADD.w   d2,d7 ; Y+Height
  12144.     MOVE.w  d7,4(a1) ; Write Y
  12145.     ADD.w   #8,a1
  12146.     SUBQ.l  #1,d1 ; Next pixel
  12147.     BGE     _MWrapParticlesQClipLoop
  12148.   RTS
  12149. _MWrapParticlesQClipSkip4
  12150.     SUB.w   d2,d7 ; Y-Height
  12151.     MOVE.w  d7,4(a1) ; Write Y
  12152.     ADD.w   #8,a1
  12153.     SUBQ.l  #1,d1 ; Next pixel
  12154.     BGE     _MWrapParticlesQClipLoop
  12155.   RTS
  12156.  
  12157. ;*************************************************************************************
  12158.  
  12159. _MReboundParticles
  12160. ;Rebound X.w,Y.w particles off the edges of the bitmap. Particle directions X.w,Y.w change if within detection zone
  12161.   TST.b   _ParticleFormat ; What format?
  12162.   BLT     _MReboundParticlesQ ; Data is in X.q,Y.q format
  12163.   BGT     _MReboundParticlesA ; Data is in Ptr.l format
  12164.   ;Data is in X.w,Y.w format
  12165.   MOVE.l  d0,a1 ; Coordinate list
  12166.   MOVE.l  d2,a2 ; Direction list
  12167.   MOVE.w  CurrentChunkyBitmap1,d0
  12168.   !GetBitmapObjectPtr ; Base in a0
  12169.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  12170.   BNE     _MReboundParticlesClip
  12171.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d5 ; Width X2
  12172.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d6 ; Height Y2
  12173.   SUB.w   d3,d5 ; X2-zone
  12174.   SUB.w   d3,d6 ; Y2-zone
  12175.   MOVEQ.l #4,d0 ; Adder
  12176. _MReboundParticlesLoop
  12177.     MOVE.w  (a1),d4 ; Read X
  12178.     CMP.w   d3,d4 ; X<X1?
  12179.     BLT     _MReboundParticlesSkip1
  12180.     CMP.w   d5,d4 ; X>=X2?
  12181.     BGE     _MReboundParticlesSkip1
  12182.     MOVE.w  2(a1),d4 ; Read y
  12183.     CMP.w   d3,d4 ; Y<Y1?
  12184.     BLT     _MReboundParticlesSkip2
  12185.     CMP.w   d6,d4 ; Y>=Y2?
  12186.     BGE     _MReboundParticlesSkip2
  12187.     ADD.w   d0,a1
  12188.     ADD.w   d0,a2
  12189.     SUBQ.l  #1,d1 ; Next pixel
  12190.     BGT     _MReboundParticlesLoop
  12191.   RTS
  12192. _MReboundParticlesSkip1
  12193.     NEG.w   (a2) ; Change x direction
  12194.     MOVE.w  2(a1),d4 ; Read y
  12195.     CMP.w   d3,d4 ; Y<Y1?
  12196.     BLT     _MReboundParticlesSkip2
  12197.     CMP.w   d6,d4 ; Y>=Y2?
  12198.     BGE     _MReboundParticlesSkip2
  12199.     ADD.w   d0,a1
  12200.     ADD.w   d0,a2
  12201.     SUBQ.l  #1,d1 ; Next pixel
  12202.     BGT     _MReboundParticlesLoop
  12203.   RTS
  12204. _MReboundParticlesSkip2
  12205.     NEG.w   2(a2) ; Change y direction
  12206.     ADD.w   d0,a1
  12207.     ADD.w   d0,a2
  12208.     SUBQ.l  #1,d1 ; Next pixel
  12209.     BGT     _MReboundParticlesLoop
  12210.   RTS
  12211. _MReboundParticlesClip
  12212. ;Only bounce the particles that are inside of the clip window
  12213.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d7 ; X1
  12214.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  12215.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  12216.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  12217.   ADD.w   d7,d5 ; X2 outside of window
  12218.   ADD.w   d4,d6 ; Y2 outside of window
  12219.   SUB.w   d3,d5 ; X2-zone
  12220.   SUB.w   d3,d6 ; Y2-zone
  12221.   ADD.w   d3,d7 ; X1+zone
  12222.   ADD.w   d3,d4 ; Y1+zone
  12223.   MOVEQ.l #4,d0 ; adder
  12224. _MReboundParticlesClipLoop
  12225.     MOVE.w  (a1),d3 ; Read X
  12226.     CMP.w   d7,d3 ; X<X1?
  12227.     BLT     _MReboundParticlesClipSkip1
  12228.     CMP.w   d5,d3 ; X>=X2?
  12229.     BGE     _MReboundParticlesClipSkip1
  12230.     MOVE.w  2(a1),d3 ; Read y
  12231.     CMP.w   d4,d3 ; Y<Y1?
  12232.     BLT     _MReboundParticlesClipSkip2
  12233.     CMP.w   d6,d3 ; Y>=Y2?
  12234.     BGE     _MReboundParticlesClipSkip2
  12235.     ADD.w   d0,a1
  12236.     ADD.w   d0,a2
  12237.     SUBQ.l  #1,d1 ; Next pixel
  12238.     BGT     _MReboundParticlesClipLoop
  12239.   RTS
  12240. _MReboundParticlesClipSkip1
  12241.     NEG.w   (a2) ; Change x direction
  12242.     MOVE.w  2(a1),d3 ; Read y
  12243.     CMP.w   d4,d3 ; Y<Y1?
  12244.     BLT     _MReboundParticlesClipSkip2
  12245.     CMP.w   d6,d3 ; Y>=Y2?
  12246.     BGE     _MReboundParticlesClipSkip2
  12247.     ADD.w   d0,a1
  12248.     ADD.w   d0,a2
  12249.     SUBQ.l  #1,d1 ; Next pixel
  12250.     BGT     _MReboundParticlesClipLoop
  12251.   RTS
  12252. _MReboundParticlesClipSkip2
  12253.     NEG.w   2(a2) ; Change y direction
  12254.     ADD.w   d0,a1
  12255.     ADD.w   d0,a2
  12256.     SUBQ.l  #1,d1 ; Next pixel
  12257.     BGT     _MReboundParticlesClipLoop
  12258.   RTS
  12259.  
  12260. _MReboundParticlesA
  12261.   ; Not possible to rebound addresses
  12262.   RTS
  12263.  
  12264. _MReboundParticlesQ
  12265. ;Rebound X.q,Y.q particles off the edges of the bitmap. Particle directions X.q,Y.q change if within detection zone
  12266.   MOVE.l  d0,a1 ; Coordinate list
  12267.   MOVE.l  d2,a2 ; Direction list
  12268.   MOVE.w  CurrentChunkyBitmap1,d0
  12269.   !GetBitmapObjectPtr ; Base in a0
  12270.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  12271.   BNE     _MReboundParticlesQClip
  12272.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d5 ; Width X2
  12273.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d6 ; Height Y2
  12274.   SUB.w   d3,d5 ; X2-zone
  12275.   SUB.w   d3,d6 ; Y2-zone
  12276.   MOVEQ.l #8,d0 ; Adder
  12277. _MReboundParticlesQLoop
  12278.     MOVE.w  (a1),d4 ; Read X
  12279.     CMP.w   d3,d4 ; X<X1?
  12280.     BLT     _MReboundParticlesQSkip1
  12281.     CMP.w   d5,d4 ; X>=X2?
  12282.     BGE     _MReboundParticlesQSkip1
  12283.     MOVE.w  4(a1),d4 ; Read y
  12284.     CMP.w   d3,d4 ; Y<Y1?
  12285.     BLT     _MReboundParticlesQSkip2
  12286.     CMP.w   d6,d4 ; Y>=Y2?
  12287.     BGE     _MReboundParticlesQSkip2
  12288.     ADD.w   d0,a1
  12289.     ADD.w   d0,a2
  12290.     SUBQ.l  #1,d1 ; Next pixel
  12291.     BGT     _MReboundParticlesQLoop
  12292.   RTS
  12293. _MReboundParticlesQSkip1
  12294.     NEG.l   (a2) ; Change x direction
  12295.     MOVE.w  4(a1),d4 ; Read y
  12296.     CMP.w   d3,d4 ; Y<Y1?
  12297.     BLT     _MReboundParticlesQSkip2
  12298.     CMP.w   d6,d4 ; Y>=Y2?
  12299.     BGE     _MReboundParticlesQSkip2
  12300.     ADD.w   d0,a1
  12301.     ADD.w   d0,a2
  12302.     SUBQ.l  #1,d1 ; Next pixel
  12303.     BGT     _MReboundParticlesQLoop
  12304.   RTS
  12305. _MReboundParticlesQSkip2
  12306.     NEG.l   4(a2) ; Change y direction
  12307.     ADD.w   d0,a1
  12308.     ADD.w   d0,a2
  12309.     SUBQ.l  #1,d1 ; Next pixel
  12310.     BGT     _MReboundParticlesQLoop
  12311.   RTS
  12312. _MReboundParticlesQClip
  12313. ;Only bounce the particles that are inside of the clip window
  12314.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d7 ; X1
  12315.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  12316.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  12317.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  12318.   ADD.w   d7,d5 ; X2 outside of window
  12319.   ADD.w   d4,d6 ; Y2 outside of window
  12320.   SUB.w   d3,d5 ; X2-zone
  12321.   SUB.w   d3,d6 ; Y2-zone
  12322.   ADD.w   d3,d7 ; X1+zone
  12323.   ADD.w   d3,d4 ; Y1+zone
  12324.   MOVEQ.l #8,d0 ; adder
  12325. _MReboundParticlesQClipLoop
  12326.     MOVE.w  (a1),d3 ; Read X
  12327.     CMP.w   d7,d3 ; X<X1?
  12328.     BLT     _MReboundParticlesQClipSkip1
  12329.     CMP.w   d5,d3 ; X>=X2?
  12330.     BGE     _MReboundParticlesQClipSkip1
  12331.     MOVE.w  4(a1),d3 ; Read y
  12332.     CMP.w   d4,d3 ; Y<Y1?
  12333.     BLT     _MReboundParticlesQClipSkip2
  12334.     CMP.w   d6,d3 ; Y>=Y2?
  12335.     BGE     _MReboundParticlesQClipSkip2
  12336.     ADD.w   d0,a1
  12337.     ADD.w   d0,a2
  12338.     SUBQ.l  #1,d1 ; Next pixel
  12339.     BGT     _MReboundParticlesQClipLoop
  12340.   RTS
  12341. _MReboundParticlesQClipSkip1
  12342.     NEG.l   (a2) ; Change x direction
  12343.     MOVE.w  4(a1),d3 ; Read y
  12344.     CMP.w   d4,d3 ; Y<Y1?
  12345.     BLT     _MReboundParticlesQClipSkip2
  12346.     CMP.w   d6,d3 ; Y>=Y2?
  12347.     BGE     _MReboundParticlesQClipSkip2
  12348.     ADD.w   d0,a1
  12349.     ADD.w   d0,a2
  12350.     SUBQ.l  #1,d1 ; Next pixel
  12351.     BGT     _MReboundParticlesQClipLoop
  12352.   RTS
  12353. _MReboundParticlesQClipSkip2
  12354.     NEG.l   4(a2) ; Change y direction
  12355.     ADD.w   d0,a1
  12356.     ADD.w   d0,a2
  12357.     SUBQ.l  #1,d1 ; Next pixel
  12358.     BGT     _MReboundParticlesQClipLoop
  12359.   RTS
  12360.  
  12361. ;*************************************************************************************
  12362.  
  12363. _MProcessor
  12364. ;Return cpu that is currently available as number from 0 to 6
  12365.   MOVE.l  $4,a0 ; ExecBase
  12366.   ADD.l   #AttnFlags,a0 ; ExecBase->AttnFlags
  12367.   MOVE.w  (a0),d1 ; Get flags
  12368.   MOVEQ.l #6,d0
  12369.   BTST    #7,d1 ; 060?
  12370.   BNE     _MProcessorDone
  12371.   MOVEQ.l #4,d0
  12372.   BTST    #3,d1 ; 040?
  12373.   BNE     _MProcessorDone
  12374.   MOVEQ.l #3,d0
  12375.   BTST    #2,d1 ; 030?
  12376.   BNE     _MProcessorDone
  12377.   MOVEQ.l #2,d0
  12378.   BTST    #1,d1 ; 020?
  12379.   BNE     _MProcessorDone
  12380.   MOVEQ.l #1,d0
  12381.   BTST    #0,d1 ; 010?
  12382.   BNE     _MProcessorDone
  12383.   MOVEQ.l #0,d0
  12384. _MProcessorDone
  12385.   RTS
  12386.  
  12387. ;*************************************************************************************
  12388.  
  12389. _MAddXYToParticles
  12390. ;Add X.w constant to X.w coords, and Y.w constant to Y.w coords, in particle list
  12391.   TST.w   d2 ; Add X?
  12392.   BEQ     _MAddXYToParticlesYOnly
  12393.   TST.w   d3 ; Add X and Y?
  12394.   BEQ     _MAddXYToParticlesXOnly
  12395.   MOVE.l  d0,a1 ; Particle list
  12396.   MOVE.w  CurrentChunkyBitmap1,d0
  12397.   !GetBitmapObjectPtr ; Base in a0
  12398.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  12399.   BNE     _MAddXYToParticlesClip
  12400. _MAddXYToParticlesLoop
  12401.     ADD.w   d2,(a1)+ ; X.w+XAdder.w
  12402.     ADD.w   d3,(a1)+ ; Y.w+YAdder.w
  12403.     SUBQ.l  #1,d1 ; Next pixel
  12404.     BGT     _MAddXYToParticlesLoop
  12405.   RTS
  12406. _MAddXYToParticlesClip
  12407. ;Only move the particles that are within the clip window
  12408.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d7 ; X1
  12409.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  12410.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  12411.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  12412.   ADD.w   d7,d5 ; X2 outside of window
  12413.   ADD.w   d4,d6 ; Y2 outside of window
  12414.   MOVE.l  d2,a2
  12415. _MAddXYToParticlesClipLoop
  12416.     MOVE.w  (a1),d0 ; Get x
  12417.     CMP.w   d7,d0 ; X<X1?
  12418.     BLT     _MAddXYToParticlesClipSkip
  12419.     CMP.w   d5,d0 ; X>=X2?
  12420.     BGE     _MAddXYToParticlesClipSkip
  12421.     MOVE.w  2(a1),d2 ; Get y
  12422.     CMP.w   d4,d2 ; Y<Y1?
  12423.     BLT     _MAddXYToParticlesClipSkip
  12424.     CMP.w   d6,d2 ; Y>=Y2?
  12425.     BGE     _MAddXYToParticlesClipSkip
  12426.     ADD.w   a2,d0 ; X.w+XAdder.w
  12427.     MOVE.w  d0,(a1)+ ; Write
  12428.     ADD.w   d3,d2 ; Y.w+YAdder.w
  12429.     MOVE.w  d2,(a1)+ ; Write
  12430.     SUBQ.l  #1,d1 ; Next pixel
  12431.     BGT     _MAddXYToParticlesClipLoop
  12432.   RTS;pop
  12433. _MAddXYToParticlesClipSkip
  12434.     ADD.w   #4,a1
  12435.     SUBQ.l  #1,d1 ; Next pixel
  12436.     BGT     _MAddXYToParticlesClipLoop
  12437.   RTS
  12438. _MAddXYToParticlesXOnly
  12439. ;Add X.w constant to X.w coords in particle list
  12440.   MOVE.l  d0,a1 ; Particle list
  12441.   MOVE.w  CurrentChunkyBitmap1,d0
  12442.   !GetBitmapObjectPtr ; Base in a0
  12443.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  12444.   BNE     _MAddXYToParticlesXOnlyClip
  12445.   MOVEQ.l #4,d3 ; Skip value
  12446. _MAddXYToParticlesXOnlyLoop
  12447.     ADD.w   d2,(a1) ; X.w+XAdder.w
  12448.     ADD.w   d3,a1 ; skip Y
  12449.     SUBQ.l  #1,d1 ; Next pixel
  12450.     BGT     _MAddXYToParticlesXOnlyLoop
  12451.   RTS
  12452. _MAddXYToParticlesXOnlyClip
  12453. ;Only move the particles that are within the clip window
  12454.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d7 ; X1
  12455.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  12456.   ADD.w   d7,d5 ; X2 outside of window
  12457.   MOVEQ.l #4,d3 ; Skip value
  12458. _MAddXYToParticlesXOnlyClipLoop
  12459.     MOVE.w  (a1),d0 ; Get x
  12460.     CMP.w   d7,d0 ; X<X1?
  12461.     BLT     _MAddXYToParticlesXOnlyClipSkip
  12462.     CMP.w   d5,d0 ; X>=X2?
  12463.     BGE     _MAddXYToParticlesXOnlyClipSkip
  12464.     ADD.w   d2,d0 ; X.w+XAdder.w
  12465.     MOVE.w  d0,(a1) ; Write
  12466.     ADD.w   d3,a1 ; skip Y
  12467.     SUBQ.l  #1,d1 ; Next pixel
  12468.     BGT     _MAddXYToParticlesXOnlyClipLoop
  12469.   RTS;pop
  12470. _MAddXYToParticlesXOnlyClipSkip
  12471.     ADD.w   d3,a1
  12472.     SUBQ.l  #1,d1 ; Next pixel
  12473.     BGT     _MAddXYToParticlesXOnlyClipLoop
  12474.   RTS
  12475. _MAddXYToParticlesYOnly
  12476. ;Add Y.w constant to Y.w coords in particle list
  12477.   MOVE.l  d0,a1 ; Particle list
  12478.   MOVE.w  CurrentChunkyBitmap1,d0
  12479.   !GetBitmapObjectPtr ; Base in a0
  12480.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  12481.   BNE     _MAddXYToParticlesYOnlyClip
  12482.   MOVEQ.l #4,d3 ; Skip value
  12483.   ADD.w   #2,a1 ; Skip X
  12484. _MAddXYToParticlesYOnlyLoop
  12485.     ADD.w   d2,(a1) ; Y.w+YAdder.w
  12486.     ADD.w   d3,a1 ; next
  12487.     SUBQ.l  #1,d1 ; Next pixel
  12488.     BGT     _MAddXYToParticlesYOnlyLoop
  12489.   RTS
  12490. _MAddXYToParticlesYOnlyClip
  12491. ;Only move the particles that are within the clip window
  12492.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  12493.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  12494.   ADD.w   d4,d6 ; Y2 outside of window
  12495.   MOVEQ.l #4,d3 ; Skip value
  12496.   ADD.w   #2,a1 ; Skip X
  12497. _MAddXYToParticlesYOnlyClipLoop
  12498.     MOVE.w  (a1),d0 ; Get y
  12499.     CMP.w   d4,d0 ; Y<Y1?
  12500.     BLT     _MAddXYToParticlesYOnlyClipSkip
  12501.     CMP.w   d6,d0 ; Y>=Y2?
  12502.     BGE     _MAddXYToParticlesYOnlyClipSkip
  12503.     ADD.w   d2,d0 ; Y.w+YAdder.w
  12504.     MOVE.w  d0,(a1) ; Write
  12505.     ADD.w   d3,a1 ; next
  12506.     SUBQ.l  #1,d1 ; Next pixel
  12507.     BGT     _MAddXYToParticlesYOnlyClipLoop
  12508.   RTS;pop
  12509. _MAddXYToParticlesYOnlyClipSkip
  12510.     ADD.w   d3,a1
  12511.     SUBQ.l  #1,d1 ; Next pixel
  12512.     BGT     _MAddXYToParticlesYOnlyClipLoop
  12513.   RTS
  12514.  
  12515. ;*************************************************************************************
  12516.  
  12517. _MAddXYToParticlesA
  12518. ;Add Ptr.l constant to Ptr.l entries in particle list. No clipping!
  12519.   MOVE.l  d0,a1 ; Particle list
  12520.   MOVE.l  d1,d7 ; Copy counter
  12521.   AND.b   #$F0,d7 ; Multiples of 16
  12522.   BEQ     _MAddXYToParticlesASkip
  12523. _MAddXYToParticlesA4Loop
  12524.     ADD.l   d2,(a1)+ ; Ptr.l+PtrAdder.l
  12525.     ADD.l   d2,(a1)+ ; Ptr.l+PtrAdder.l
  12526.     ADD.l   d2,(a1)+ ; Ptr.l+PtrAdder.l
  12527.     ADD.l   d2,(a1)+ ; Ptr.l+PtrAdder.l
  12528.     ADD.l   d2,(a1)+ ; Ptr.l+PtrAdder.l
  12529.     ADD.l   d2,(a1)+ ; Ptr.l+PtrAdder.l
  12530.     ADD.l   d2,(a1)+ ; Ptr.l+PtrAdder.l
  12531.     ADD.l   d2,(a1)+ ; Ptr.l+PtrAdder.l
  12532.     ADD.l   d2,(a1)+ ; Ptr.l+PtrAdder.l
  12533.     ADD.l   d2,(a1)+ ; Ptr.l+PtrAdder.l
  12534.     ADD.l   d2,(a1)+ ; Ptr.l+PtrAdder.l
  12535.     ADD.l   d2,(a1)+ ; Ptr.l+PtrAdder.l
  12536.     ADD.l   d2,(a1)+ ; Ptr.l+PtrAdder.l
  12537.     ADD.l   d2,(a1)+ ; Ptr.l+PtrAdder.l
  12538.     ADD.l   d2,(a1)+ ; Ptr.l+PtrAdder.l
  12539.     ADD.l   d2,(a1)+ ; Ptr.l+PtrAdder.l
  12540.     SUB.l   #16,d7 ; Next pixels
  12541.     BGT     _MAddXYToParticlesA4Loop
  12542. _MAddXYToParticlesASkip
  12543.   AND.l   #$0000000F,d1 ; Counter leftover entries
  12544.   BEQ     _MAddXYToParticlesASkip2
  12545. _MAddXYToParticlesA1Loop
  12546.     ADD.l   d2,(a2)+ ; Ptr.l+PtrAdder.l
  12547.     SUBQ.l  #1,d1 ; Next pixel
  12548.     BGT     _MAddXYToParticlesA1Loop
  12549. _MAddXYToParticlesASkip2
  12550.   RTS
  12551.  
  12552. ;*************************************************************************************
  12553.  
  12554. _MAddXYToParticlesQ
  12555. ;Add X.q constant to X.q coords, and Y.q constant to Y.q coords, in particle list
  12556.   TST.l   d2 ; Add X?
  12557.   BEQ     _MAddXYToParticlesQYOnly
  12558.   TST.l   d3 ; Add X and Y?
  12559.   BEQ     _MAddXYToParticlesQXOnly
  12560.   MOVE.l  d0,a1 ; Particle list
  12561.   MOVE.w  CurrentChunkyBitmap1,d0
  12562.   !GetBitmapObjectPtr ; Base in a0
  12563.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  12564.   BNE     _MAddXYToParticlesQClip
  12565. _MAddXYToParticlesQLoop
  12566.     ADD.l   d2,(a1)+ ; X.q+XAdder.q
  12567.     ADD.l   d3,(a1)+ ; Y.q+YAdder.q
  12568.     SUBQ.l  #1,d1 ; Next pixel
  12569.     BGT     _MAddXYToParticlesQLoop
  12570.   RTS
  12571. _MAddXYToParticlesQClip
  12572. ;Only move the particles that are within the clip window
  12573.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d7 ; X1
  12574.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  12575.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  12576.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  12577.   ADD.w   d7,d5 ; X2 outside of window
  12578.   ADD.w   d4,d6 ; Y2 outside of window
  12579.   MOVE.l  d2,a2
  12580. _MAddXYToParticlesQClipLoop
  12581.     MOVE.w  (a1),d0 ; Get x
  12582.     CMP.w   d7,d0 ; X<X1?
  12583.     BLT     _MAddXYToParticlesQClipSkip
  12584.     CMP.w   d5,d0 ; X>=X2?
  12585.     BGE     _MAddXYToParticlesQClipSkip
  12586.     MOVE.w  4(a1),d2 ; Get y
  12587.     CMP.w   d4,d2 ; Y<Y1?
  12588.     BLT     _MAddXYToParticlesQClipSkip
  12589.     CMP.w   d6,d2 ; Y>=Y2?
  12590.     BGE     _MAddXYToParticlesQClipSkip
  12591.     ADD.l   a2,d0 ; X.q+XAdder.q
  12592.     MOVE.l  d0,(a1)+ ; Write
  12593.     ADD.l   d3,d2 ; Y.q+YAdder.q
  12594.     MOVE.l  d2,(a1)+ ; Write
  12595.     SUBQ.l  #1,d1 ; Next pixel
  12596.     BGT     _MAddXYToParticlesQClipLoop
  12597.   RTS;pop
  12598. _MAddXYToParticlesQClipSkip
  12599.     ADD.w   #8,a1
  12600.     SUBQ.l  #1,d1 ; Next pixel
  12601.     BGT     _MAddXYToParticlesQClipLoop
  12602.   RTS
  12603. _MAddXYToParticlesQXOnly
  12604. ;Add X.q constant to X.q coords in particle list
  12605.   MOVE.l  d0,a1 ; Particle list
  12606.   MOVE.w  CurrentChunkyBitmap1,d0
  12607.   !GetBitmapObjectPtr ; Base in a0
  12608.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  12609.   BNE     _MAddXYToParticlesQXOnlyClip
  12610.   MOVEQ.l #8,d3 ; Skip value
  12611. _MAddXYToParticlesQXOnlyLoop
  12612.     ADD.l   d2,(a1) ; X.q+XAdder.q
  12613.     ADD.w   d3,a1 ; skip Y
  12614.     SUBQ.l  #1,d1 ; Next pixel
  12615.     BGT     _MAddXYToParticlesQXOnlyLoop
  12616.   RTS
  12617. _MAddXYToParticlesQXOnlyClip
  12618. ;Only move the particles that are within the clip window
  12619.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d7 ; X1
  12620.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  12621.   ADD.w   d7,d5 ; X2 outside of window
  12622.   MOVEQ.l #8,d3 ; Skip value
  12623. _MAddXYToParticlesQXOnlyClipLoop
  12624.     MOVE.w  (a1),d0 ; Get x
  12625.     CMP.w   d7,d0 ; X<X1?
  12626.     BLT     _MAddXYToParticlesQXOnlyClipSkip
  12627.     CMP.w   d5,d0 ; X>=X2?
  12628.     BGE     _MAddXYToParticlesQXOnlyClipSkip
  12629.     ADD.l   d2,(a1) ; X.w+XAdder.w
  12630.     ADD.w   d3,a1 ; skip Y
  12631.     SUBQ.l  #1,d1 ; Next pixel
  12632.     BGT     _MAddXYToParticlesQXOnlyClipLoop
  12633.   RTS;pop
  12634. _MAddXYToParticlesQXOnlyClipSkip
  12635.     ADD.w   d3,a1
  12636.     SUBQ.l  #1,d1 ; Next pixel
  12637.     BGT     _MAddXYToParticlesQXOnlyClipLoop
  12638.   RTS
  12639. _MAddXYToParticlesQYOnly
  12640. ;Add Y.q constant to Y.q coords in particle list
  12641.   MOVE.l  d0,a1 ; Particle list
  12642.   MOVE.w  CurrentChunkyBitmap1,d0
  12643.   !GetBitmapObjectPtr ; Base in a0
  12644.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  12645.   BNE     _MAddXYToParticlesQYOnlyClip
  12646.   MOVEQ.l #8,d3 ; Skip value
  12647.   ADD.w   #4,a1 ; Skip X
  12648. _MAddXYToParticlesQYOnlyLoop
  12649.     ADD.l   d2,(a1) ; Y.q+YAdder.q
  12650.     ADD.w   d3,a1 ; next
  12651.     SUBQ.l  #1,d1 ; Next pixel
  12652.     BGT     _MAddXYToParticlesQYOnlyLoop
  12653.   RTS
  12654. _MAddXYToParticlesQYOnlyClip
  12655. ;Only move the particles that are within the clip window
  12656.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  12657.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  12658.   ADD.w   d4,d6 ; Y2 outside of window
  12659.   MOVEQ.l #8,d3 ; Skip value
  12660.   ADD.w   #4,a1 ; Skip X
  12661. _MAddXYToParticlesQYOnlyClipLoop
  12662.     MOVE.w  (a1),d0 ; Get y
  12663.     CMP.w   d4,d0 ; Y<Y1?
  12664.     BLT     _MAddXYToParticlesQYOnlyClipSkip
  12665.     CMP.w   d6,d0 ; Y>=Y2?
  12666.     BGE     _MAddXYToParticlesQYOnlyClipSkip
  12667.     ADD.l   d2,(a1) ; Y.q+YAdder.q
  12668.     ADD.w   d3,a1 ; next
  12669.     SUBQ.l  #1,d1 ; Next pixel
  12670.     BGT     _MAddXYToParticlesQYOnlyClipLoop
  12671.   RTS;pop
  12672. _MAddXYToParticlesQYOnlyClipSkip
  12673.     ADD.w   d3,a1
  12674.     SUBQ.l  #1,d1 ; Next pixel
  12675.     BGT     _MAddXYToParticlesQYOnlyClipLoop
  12676.   RTS
  12677.  
  12678. ;*************************************************************************************
  12679.  
  12680. _MParticleModeShort
  12681.   MOVE.w  _ParticleModeType,d0
  12682.   EXT.l   d0 ; Return current mode in d0
  12683.   RTS
  12684. _MParticleMode
  12685. ;Set blit mode type for particle plot/draw. 4=MColourMode, 5=MReMapMode, 6=MSimpleReMapMode, 7=MAddMode
  12686.   CMP.w   #7,d0 ; Too high?
  12687.   BGT     _MParticleModeJump
  12688.   CMP.w   #4,d0 ; Too low?
  12689.   BLT     _MParticleModeJump
  12690.   MOVE.w  d0,_ParticleModeType ; Directly copy type number
  12691.   RTS
  12692. _MParticleModeJump
  12693.   MOVE.w  #4,_ParticleModeType ; Default to MColourMode
  12694.   RTS
  12695.  
  12696. ;*************************************************************************************
  12697.  
  12698. _MMildredBase
  12699. ;Return base of Mildred's internal data area
  12700.   LEA     _Data(pc),a0
  12701.   MOVE.l  a0,d0 ; Return base in d0
  12702.   RTS
  12703.  
  12704. ;*************************************************************************************
  12705.  
  12706. _MDrawingModeShort
  12707.   MOVE.w  _DrawingModeType,d0
  12708.   EXT.l   d0 ; Return current mode in d0
  12709.   RTS
  12710. _MDrawingMode
  12711. ;Set drawing mode type for drawing operations
  12712.   CMP.w   #8,d0 ; Direct?
  12713.   BGE     _MDrawingModeJump
  12714.   MOVE.w  d0,_DrawingModeType ; Directly copy type number
  12715.   RTS
  12716. _MDrawingModeJump
  12717.   CMP.w   #_InvMode,d0 ; InvMode?
  12718.   BNE     _MDrawingModeSkip
  12719.   MOVE.w  #2,_DrawingModeType ; Store type for InvMode
  12720.   RTS
  12721. _MDrawingModeSkip
  12722.   MOVE.w  #4,_DrawingModeType ; Default others to MColourMode
  12723.   RTS
  12724.  
  12725. ;*************************************************************************************
  12726.  
  12727. _MParticleFormatShort
  12728.   MOVE.b  _ParticleFormat,d0
  12729.   EXT.w   d0
  12730.   EXT.l   d0 ; Return current format in d0
  12731.   RTS
  12732. _MParticleFormat
  12733. ;Set format to use for particle operations. 0=word, <0=quick, >0=address
  12734.   MOVE.b  d0,_ParticleFormat ; Directly copy type number
  12735.   RTS
  12736.  
  12737. ;*************************************************************************************
  12738.  
  12739. _MPictureDissolveOut
  12740. ;Wipe out the first-used bitmap using bitmap design d0, currently colour d1, and wipe it to colour in d2
  12741.   MOVE.b  d2,d7 ; Wipe-to this colour
  12742.   MOVE.b  d1,d2 ; Store colour
  12743.   !GetBitmapObjectPtr ; Base in a0
  12744.   MOVE.l  a0,a1 ; Picture bitmap
  12745.   MOVE.w  CurrentChunkyBitmap1,d0 ; Dest bitmap
  12746.   !GetBitmapObjectPtr ; Base in a0
  12747.   MOVE.l  a3,-(a7) ; Store
  12748.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a2 ; Dest data
  12749.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a3 ; Picture design data
  12750.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Dest wraps?
  12751.   BEQ     _MPictureDONoWrap1
  12752.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a2
  12753. _MPictureDONoWrap1
  12754.   TST.b   CRsrc_Wrapping-ChunkyResources(a1) ; Pic wraps?
  12755.   BEQ     _MPictureDONoWrap2
  12756.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a3
  12757. _MPictureDONoWrap2
  12758.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d5 ; Dest linemod
  12759.   MOVE.w  CRsrc_LineMod-ChunkyResources(a1),d6 ; Picture linemod
  12760.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  12761.   BEQ     _MPictureDONoClip
  12762.   ADD.l   CRsrc_ClipBytes-ChunkyResources(a0),a2
  12763.   ADD.w   CRsrc_ClipLMod-ChunkyResources(a0),d5
  12764.   ADD.l   CRsrc_ClipBytes-ChunkyResources(a1),a3
  12765.   ADD.w   CRsrc_ClipLMod-ChunkyResources(a1),d6
  12766.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d0 ; Width
  12767.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d1 ; Height
  12768.   BRA     _MPictureDissolveOutSkip2
  12769. _MPictureDONoClip
  12770.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d0 ; Width
  12771.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d1 ; Height
  12772. _MPictureDissolveOutSkip2
  12773.   LSR.w   #2,d0 ; Width/4 for longwords
  12774.   SUBQ.w  #1,d0 ; XLoopcounter
  12775.   MOVE.w  d0,d3 ; Copy XLoop
  12776.   SUBQ.w  #1,d1 ; YLoopcounter
  12777.   MOVEQ.l #4,d4 ; Temp skip value
  12778. _MPictureDOYLoop
  12779.     MOVE.w  d3,d0 ; Copy XLoop
  12780. _MPictureDOXLoop
  12781.       CMP.b   (a3)+,d2
  12782.       BNE     _MPictureDOJump1
  12783.       MOVE.b  d7,(a2)
  12784. _MPictureDOJump1
  12785.       CMP.b   (a3)+,d2
  12786.       BNE     _MPictureDOJump2
  12787.       MOVE.b  d7,1(a2)
  12788. _MPictureDOJump2
  12789.       CMP.b   (a3)+,d2
  12790.       BNE     _MPictureDOJump3
  12791.       MOVE.b  d7,2(a2)
  12792. _MPictureDOJump3
  12793.       CMP.b   (a3)+,d2
  12794.       BNE     _MPictureDOJump4
  12795.       MOVE.b  d7,3(a2)
  12796. _MPictureDOJump4
  12797.       ADD.w   d4,a2
  12798.       DBRA    d0,_MPictureDOXLoop
  12799.     ADD.w   d5,a2 ; Source linemod
  12800.     ADD.w   d6,a3 ; Dest linemod
  12801.     DBRA    d1,_MPictureDOYLoop
  12802.   MOVE.l  (a7)+,a3 ; Restore
  12803. _MPictureDissolveOutSkip
  12804.   RTS
  12805.  
  12806. ;*************************************************************************************
  12807.  
  12808. _MBlockUnQueueRangeShort
  12809. ;Block-UnQueue a range of the queued objects to the dest bitmap by way of a clearscreen. Width and coords should be multiple 16
  12810.   !GetQueueObjectPtr ; Base in a0
  12811.   MOVE.l  CQueue_LMem-ChunkyQueues(a0),a1 ; Base of queue
  12812.   SUB.w   d1,d2 ; Find loopcounter
  12813.   EXT.l   d1
  12814.   LSL.l   #ChunkyQueueListStructSize,d1 ; Offset
  12815.   ADD.l   d1,a1 ; Find list item in queue
  12816.   MOVE.w  d2,d1 ; Position
  12817.   BRA     _MBlockUnQueueShortEntry
  12818. _MBlockUnQueueShort
  12819. ;Block-UnQueue the queued objects to the dest bitmap by way of a clearscreen. Width and coords should be multiple of 16.
  12820.   !GetQueueObjectPtr ; Base in a0
  12821.   MOVE.l  CQueue_LMem-ChunkyQueues(a0),a1 ; Base of queue
  12822.   MOVE.w  CQueue_Items-ChunkyQueues(a0),d1 ; Number of items
  12823.   SUBQ.w  #1,d1 ; QueueItemLoopcounter
  12824.   MOVE.w  #0,CQueue_Items-ChunkyQueues(a0) ; Empty
  12825.   MOVE.l  CQueue_LMem-ChunkyQueues(a0),CQueue_ItemAddr-ChunkyQueues(a0) ; Empty
  12826. _MBlockUnQueueShortEntry
  12827.   MOVE.b  CurrentInk1,d4
  12828.   MOVE.b  d4,d6
  12829.   LSL.w   #8,d6
  12830.   MOVE.b  d4,d6
  12831.   SWAP    d6
  12832.   MOVE.b  d4,d6
  12833.   LSL.w   #8,d6
  12834.   MOVE.b  d4,d6 ; Colour to draw to (repeated 4 times)
  12835. _MBlockUnQueueClsLoop
  12836.     MOVE.l  (a1)+,a0 ; Dest address
  12837.     MOVE.w  (a1)+,d2 ; Width
  12838.     MOVE.w  (a1)+,d3 ; Height
  12839.     MOVE.w  d2,d4 ; Copy width
  12840.     MOVE.w  d3,d5 ; Copy height
  12841.     MOVE.l  (a1)+,d7 ; LineModulo
  12842.     LSR.w   #4,d4 ; /16 for groups of 4 longwords
  12843.     SUBQ.w  #1,d5 ; YLoopcounter
  12844.     ADD.w   #ChunkyQueueListStructBytes-12,a1 ; Skip to next item
  12845.     SUBQ.w  #1,d4 ; XLoopcounter
  12846. _MBlockUnQueueClsYLoop
  12847.       MOVE.w  d4,d2 ; XLoop
  12848. _MBlockUnQueueClsXLoop
  12849.         MOVE.l  d6,(a0)+ ; Write longword
  12850.         MOVE.l  d6,(a0)+ ; Write longword
  12851.         MOVE.l  d6,(a0)+ ; Write longword
  12852.         MOVE.l  d6,(a0)+ ; Write longword
  12853.         DBRA    d2,_MBlockUnQueueClsXLoop
  12854.       ADD.w   d7,a0 ; Modulo
  12855.       DBRA    d5,_MBlockUnQueueClsYLoop
  12856.     DBRA    d1,_MBlockUnQueueClsLoop
  12857.   RTS
  12858.  
  12859. _MBlockUnQueueRange
  12860. ;Block-UnQueue a range of queued objects to the dest bitmap by way of a bitmap rubthrough. Width and coords should multiple 16
  12861.   !GetQueueObjectPtr ; Base in a0
  12862.   MOVE.w  d3,d0
  12863.   MOVE.l  CQueue_LMem-ChunkyQueues(a0),a1 ; Base of queue
  12864.   SUB.w   d1,d2 ; Find loopcounter
  12865.   EXT.l   d1
  12866.   LSL.l   #ChunkyQueueListStructSize,d1 ; Offset
  12867.   ADD.l   d1,a1 ; Find list item in queue
  12868.   MOVE.w  d2,d1 ; Position
  12869.   BRA     _MBlockUnQueueEntry
  12870. _MBlockUnQueue
  12871. ;Block-UnQueue the queued objects to the dest bitmap by way of a bitmap rubthrough, width and coords should be multiple of 16!
  12872.   !GetQueueObjectPtr ; Base in a0
  12873.   MOVE.w  d1,d0
  12874.   MOVE.l  CQueue_LMem-ChunkyQueues(a0),a1 ; Base of queue
  12875.   MOVE.w  CQueue_Items-ChunkyQueues(a0),d1 ; Number of items
  12876.   MOVE.w  #0,CQueue_Items-ChunkyQueues(a0) ; Empty
  12877.   SUBQ.w  #1,d1 ; QueueItemLoopcounter
  12878.   MOVE.l  CQueue_LMem-ChunkyQueues(a0),CQueue_ItemAddr-ChunkyQueues(a0) ; Empty
  12879. _MBlockUnQueueEntry
  12880.   !GetBitmapObjectPtr ; Base in a0 - bitmap to use
  12881.   MOVE.l  CRsrc_Data-ChunkyResources(a0),d5 ; Source Data
  12882.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  12883.   BEQ     _MBlockUnQueueNoWrap
  12884.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),d5
  12885. _MBlockUnQueueNoWrap
  12886.   MOVE.l  a3,-(a7) ; Store
  12887.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),a3
  12888.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d4
  12889.   TST.b   GeneralCPUmode ; 040?
  12890.   BEQ     _MBlockUnQueueBitmap030Loop
  12891. _MBlockUnQueueBitmap040Loop
  12892.     MOVE.l  (a1)+,a0 ; Dest address
  12893.     MOVE.w  d4,d6 ; Copy source width
  12894.     MOVE.w  (a1)+,d2 ; Width
  12895.     MOVE.l  d5,a2 ; Source base
  12896.     MOVE.w  (a1)+,d3 ; Height
  12897.     SUB.w   d2,d6 ; Modulo
  12898.     MOVE.l  (a1)+,d7 ; Dest LineModulo
  12899.     SUBQ.w  #1,d3 ; YLoopcounter
  12900.     LSR.w   #4,d2 ; Width/16 for groups of 4 longwords
  12901.     ADD.l   (a1)+,a2 ; Position source
  12902.     SUBQ.w  #1,d2 ; XLoopcounter
  12903.     ADD.w   a3,d6 ; Total modulo
  12904. _MBlockUnQueueBitmap040YLoop
  12905.       MOVE.w  d2,d0 ; XLoop
  12906. _MBlockUnQueueBitmap040XLoop
  12907.         Dc.l    #_MOVE16_a2_a0 ; Copy data 16 bytes
  12908.         DBRA  d0,_MBlockUnQueueBitmap040XLoop
  12909.       ADD.w d6,a2 ; Source linemod to data
  12910.       ADD.w d7,a0 ; Dest linemod to data
  12911.       DBRA  d3,_MBlockUnQueueBitmap040YLoop
  12912.     DBRA  d1,_MBlockUnQueueBitmap040Loop
  12913.   MOVE.l (a7)+,a3 ; Restore
  12914.   RTS;pop
  12915. _MBlockUnQueueBitmap030Loop
  12916.     MOVE.l  (a1)+,a0 ; Dest address
  12917.     MOVE.w  d4,d6 ; Copy source width
  12918.     MOVE.w  (a1)+,d2 ; Width
  12919.     MOVE.l  d5,a2 ; Source base
  12920.     MOVE.w  (a1)+,d3 ; Height
  12921.     SUB.w   d2,d6 ; Modulo
  12922.     MOVE.l  (a1)+,d7 ; Dest LineModulo
  12923.     SUBQ.w  #1,d3 ; YLoopcounter
  12924.     LSR.w   #4,d2 ; Width/16 for groups of 4 longwords
  12925.     ADD.l   (a1)+,a2 ; Position source
  12926.     SUBQ.w  #1,d2 ; XLoopcounter
  12927.     ADD.w   a3,d6 ; Total modulo
  12928. _MBlockUnQueueBitmap030YLoop
  12929.       MOVE.w  d2,d0 ; XLoop
  12930. _MBlockUnQueueBitmap030XLoop
  12931.         MOVE.l  (a2)+,(a0)+ ; Copy data
  12932.         MOVE.l  (a2)+,(a0)+ ; Copy data
  12933.         MOVE.l  (a2)+,(a0)+ ; Copy data
  12934.         MOVE.l  (a2)+,(a0)+ ; Copy data ; 16 bytes
  12935.         DBRA  d0,_MBlockUnQueueBitmap030XLoop
  12936.       ADD.w d6,a2 ; Source linemod to data
  12937.       ADD.w d7,a0 ; Dest linemod to data
  12938.       DBRA  d3,_MBlockUnQueueBitmap030YLoop
  12939.     DBRA  d1,_MBlockUnQueueBitmap030Loop
  12940.   MOVE.l (a7)+,a3 ; Restore
  12941.   RTS
  12942.  
  12943. ;*************************************************************************************
  12944.  
  12945. _MWrapXParticles
  12946. ;Wrap X.w component of X.w,Y.w particles around the left and right of the bitmap. Particles reappear on opposite side
  12947.   TST.b   _ParticleFormat ; What format?
  12948.   BLT     _MWrapXParticlesQ ; Data is in X.q,Y.q format
  12949.   BGT     _MWrapXParticlesA ; Data is in Ptr.l format
  12950.   ;Data is in X.w,Y.w format
  12951.   MOVE.l  d0,a1 ; Coordinate list
  12952.   MOVE.w  CurrentChunkyBitmap1,d0
  12953.   !GetBitmapObjectPtr ; Base in a0
  12954.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  12955.   BNE     _MWrapXParticlesClip
  12956.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d5 ; Width X2
  12957. _MWrapXParticlesLoop
  12958.     MOVE.w  (a1),d3 ; Read, X<0?
  12959.     BLT     _MWrapXParticlesSkip1
  12960.     CMP.w   d5,d3 ; X>=X2?
  12961.     BGE     _MWrapXParticlesSkip2
  12962.     ADD.w   #4,a1
  12963.     SUBQ.l  #1,d1 ; Next pixel
  12964.     BGT     _MWrapXParticlesLoop
  12965.   RTS
  12966. _MWrapXParticlesSkip1
  12967.     ADD.w   d5,d3 ; X+Width
  12968.     MOVE.w  d3,(a1) ; Write X
  12969.     ADD.w   #4,a1
  12970.     SUBQ.l  #1,d1 ; Next pixel
  12971.     BGT     _MWrapXParticlesLoop
  12972.   RTS
  12973. _MWrapXParticlesSkip2
  12974.     SUB.w   d5,d3 ; X-Width
  12975.     MOVE.w  d3,(a1) ; Write X
  12976.     ADD.w   #4,a1
  12977.     SUBQ.l  #1,d1 ; Next pixel
  12978.     BGT     _MWrapXParticlesLoop
  12979.   RTS
  12980. _MWrapXParticlesClip
  12981. ;Only wrap the particles that are outside of the clip window
  12982.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  12983.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  12984.   MOVE.w  d5,d0 ; Store width
  12985.   ADD.w   d3,d5 ; X2 outside of window
  12986. _MWrapXParticlesClipLoop
  12987.     MOVE.w  (a1),d7 ; Get x
  12988.     CMP.w   d3,d7 ; X<X1?
  12989.     BLT     _MWrapXParticlesClipSkip1
  12990.     CMP.w   d5,d7 ; X>=X2?
  12991.     BGE     _MWrapXParticlesClipSkip2
  12992.     ADD.w   #4,a1
  12993.     SUBQ.l  #1,d1 ; Next pixel
  12994.     BGT     _MWrapXParticlesClipLoop
  12995.   RTS
  12996. _MWrapXParticlesClipSkip1
  12997.     ADD.w   d0,d7 ; X+Width
  12998.     MOVE.w  d7,(a1) ; Write X
  12999.     ADD.w   #4,a1
  13000.     SUBQ.l  #1,d1 ; Next pixel
  13001.     BGT     _MWrapXParticlesClipLoop
  13002.   RTS
  13003. _MWrapXParticlesClipSkip2
  13004.     SUB.w   d0,d7 ; X-Width
  13005.     MOVE.w  d7,(a1) ; Write X
  13006.     ADD.w   #4,a1
  13007.     SUBQ.l  #1,d1 ; Next pixel
  13008.     BGT     _MWrapXParticlesClipLoop
  13009.   RTS
  13010.  
  13011. _MWrapXParticlesA
  13012.   ;No X wrap for Ptr.l
  13013.   RTS
  13014.  
  13015. _MWrapXParticlesQ
  13016. ;Wrap X.q component of X.q,Y.q particles around left and right sides of the bitmap. Particles reappear on opposite sides
  13017.   MOVE.l  d0,a1 ; Coordinate list
  13018.   MOVE.w  CurrentChunkyBitmap1,d0
  13019.   !GetBitmapObjectPtr ; Base in a0
  13020.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  13021.   BNE     _MWrapXParticlesQClip
  13022.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d5 ; Width X2
  13023. _MWrapXParticlesQLoop
  13024.     MOVE.w  (a1),d3 ; Read, X<0?
  13025.     BLT     _MWrapXParticlesQSkip1
  13026.     CMP.w   d5,d3 ; X>=X2?
  13027.     BGE     _MWrapXParticlesQSkip2
  13028.     ADD.w   #8,a1
  13029.     SUBQ.l  #1,d1 ; Next pixel
  13030.     BGT     _MWrapXParticlesQLoop
  13031.   RTS
  13032. _MWrapXParticlesQSkip1
  13033.     ADD.w   d5,d3 ; X+Width
  13034.     MOVE.w  d3,(a1) ; Write X
  13035.     ADD.w   #8,a1
  13036.     SUBQ.l  #1,d1 ; Next pixel
  13037.     BGT     _MWrapXParticlesQLoop
  13038.   RTS
  13039. _MWrapXParticlesQSkip2
  13040.     SUB.w   d5,d3 ; X-Width
  13041.     MOVE.w  d3,(a1) ; Write X
  13042.     ADD.w   #8,a1
  13043.     SUBQ.l  #1,d1 ; Next pixel
  13044.     BGT     _MWrapXParticlesQLoop
  13045.   RTS
  13046. _MWrapXParticlesQClip
  13047. ;Only wrap the particles that are outside of the clip window
  13048.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  13049.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  13050.   MOVE.w  d5,d0 ; Store width
  13051.   ADD.w   d3,d5 ; X2 outside of window
  13052. _MWrapXParticlesQClipLoop
  13053.     MOVE.w  (a1),d7 ; Get x
  13054.     CMP.w   d3,d7 ; X<X1?
  13055.     BLT     _MWrapXParticlesQClipSkip1
  13056.     CMP.w   d5,d7 ; X>=X2?
  13057.     BGE     _MWrapXParticlesQClipSkip2
  13058.     ADD.w   #8,a1
  13059.     SUBQ.l  #1,d1 ; Next pixel
  13060.     BGT     _MWrapXParticlesQClipLoop
  13061.   RTS
  13062. _MWrapXParticlesQClipSkip1
  13063.     ADD.w   d0,d7 ; X+Width
  13064.     MOVE.w  d7,(a1) ; Write X
  13065.     ADD.w   #8,a1
  13066.     SUBQ.l  #1,d1 ; Next pixel
  13067.     BGT     _MWrapXParticlesQClipLoop
  13068.   RTS
  13069. _MWrapXParticlesQClipSkip2
  13070.     SUB.w   d0,d7 ; X-Width
  13071.     MOVE.w  d7,(a1) ; Write X
  13072.     ADD.w   #8,a1
  13073.     SUBQ.l  #1,d1 ; Next pixel
  13074.     BGT     _MWrapXParticlesQClipLoop
  13075.   RTS
  13076.  
  13077. ;*************************************************************************************
  13078.  
  13079. _MWrapYParticles
  13080. ;Wrap Y.w component of X.w,Y.w particles around the top and bottom of the bitmap. Particles reappear at opposite edge
  13081.   TST.b   _ParticleFormat ; What format?
  13082.   BLT     _MWrapYParticlesQ ; Data is in X.q,Y.q format
  13083.   BGT     _MWrapYParticlesA ; Data is in Ptr.l format
  13084.   ;Data is in X.w,Y.w format
  13085.   MOVE.l  d0,a1 ; Coordinate list
  13086.   MOVE.w  CurrentChunkyBitmap1,d0
  13087.   !GetBitmapObjectPtr ; Base in a0
  13088.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  13089.   BNE     _MWrapYParticlesClip
  13090.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d6 ; Height Y2
  13091.   ADD.w   #2,a1 ; Skip first X
  13092. _MWrapYParticlesLoop
  13093.     MOVE.w  (a1),d4 ; Read, Y<0?
  13094.     BLT     _MWrapYParticlesSkip1
  13095.     CMP.w   d6,d4 ; Y>=Y2?
  13096.     BGE     _MWrapYParticlesSkip2
  13097.     ADD.w   #4,a1
  13098.     SUBQ.l  #1,d1 ; Next pixel
  13099.     BGT     _MWrapYParticlesLoop
  13100.   RTS
  13101. _MWrapYParticlesSkip1
  13102.     ADD.w   d6,d4 ; Y+Height
  13103.     MOVE.w  d4,(a1) ; Write Y
  13104.     ADD.w   #4,a1
  13105.     SUBQ.l  #1,d1 ; Next pixel
  13106.     BGT     _MWrapYParticlesLoop
  13107.   RTS
  13108. _MWrapYParticlesSkip2
  13109.     SUB.w   d6,d4 ; Y-Height
  13110.     MOVE.w  d4,(a1) ; Write Y
  13111.     ADD.w   #4,a1
  13112.     SUBQ.l  #1,d1 ; Next pixel
  13113.     BGT     _MWrapYParticlesLoop
  13114.   RTS
  13115. _MWrapYParticlesClip
  13116. ;Only wrap the particles that are outside of the clip window
  13117.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  13118.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  13119.   MOVE.w  d6,d2 ; Store height
  13120.   ADD.w   d4,d6 ; Y2 outside of window
  13121.   ADD.w   #2,a1 ; Skip first X
  13122. _MWrapYParticlesClipLoop
  13123.     MOVE.w  (a1),d7 ; Get y
  13124.     CMP.w   d4,d7 ; Y<Y1?
  13125.     BLT     _MWrapYParticlesClipSkip1
  13126.     CMP.w   d6,d7 ; Y>=Y2?
  13127.     BGE     _MWrapYParticlesClipSkip2
  13128.     ADD.w   #4,a1
  13129.     SUBQ.l  #1,d1 ; Next pixel
  13130.     BGT     _MWrapYParticlesClipLoop
  13131.   RTS
  13132. _MWrapYParticlesClipSkip1
  13133.     ADD.w   d2,d7 ; Y+Height
  13134.     MOVE.w  d7,(a1) ; Write Y
  13135.     ADD.w   #4,a1
  13136.     SUBQ.l  #1,d1 ; Next pixel
  13137.     BGT     _MWrapYParticlesClipLoop
  13138.   RTS
  13139. _MWrapYParticlesClipSkip2
  13140.     SUB.w   d2,d7 ; Y-Height
  13141.     MOVE.w  d7,(a1) ; Write Y
  13142.     ADD.w   #4,a1
  13143.     SUBQ.l  #1,d1 ; Next pixel
  13144.     BGT     _MWrapYParticlesClipLoop
  13145.   RTS
  13146.  
  13147. _MWrapYParticlesA
  13148. ;Wrap Ptr.l particles around the higher and lower bounds of the bitmap. Particles reappear at opposite side to which they left
  13149.   MOVE.l  d0,a1 ; Particle list
  13150.   MOVE.w  CurrentChunkyBitmap1,d0
  13151.   !GetBitmapObjectPtr ; Base in a0
  13152.   MOVE.l  CRsrc_Data-ChunkyResources(a0),d5 ; Base
  13153.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  13154.   BEQ     _MWrapYParticlesANoWrap
  13155.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),d5
  13156. _MWrapYParticlesANoWrap
  13157.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  13158.   BNE     _MWrapYParticlesAClip
  13159.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d6 ; Get total width
  13160.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d3 ; Get height
  13161.   MULU    d3,d6 ; Total bytes
  13162.   MOVE.l  d6,d4 ; Store
  13163.   ADD.l   d5,d6 ; d6=Highest address (1 past)
  13164. _MWrapYParticlesALoop
  13165.     MOVE.l  (a1),d3 ; Get long
  13166.     CMP.l   d5,d3 ; Lower?
  13167.     BLT     _MWrapYParticlesASkip1
  13168.     CMP.l   d6,d3 ; Higher or equal?
  13169.     BGE     _MWrapYParticlesASkip2
  13170.     ADD.w   #4,a1
  13171.     SUBQ.l  #1,d1 ; Next pixel
  13172.     BGT     _MWrapYParticlesALoop
  13173.   RTS
  13174. _MWrapYParticlesASkip1
  13175.     ADD.l   d4,d3 ; Address+Bytes
  13176.     MOVE.l  d3,(a1)+ ; Write address
  13177.     SUBQ.l  #1,d1 ; Next pixel
  13178.     BGT     _MWrapYParticlesALoop
  13179.   RTS
  13180. _MWrapYParticlesASkip2
  13181.     SUB.l   d4,d3 ; Address-Bytes
  13182.     MOVE.l  d3,(a1)+ ; Write address
  13183.     SUBQ.l  #1,d1 ; Next pixel
  13184.     BGT     _MWrapYParticlesALoop
  13185.   RTS
  13186. _MWrapYParticlesAClip
  13187. ;Only wrap the particles that are within clip window bounds
  13188.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d2 ; temp
  13189.   MOVE.w  d2,d6 ; Get width
  13190.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d3 ; Get height
  13191.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d4 ; temp
  13192.   ADD.w   d4,d6 ; Total width
  13193.   MULU    d3,d6 ; Total bytes
  13194.   EXT.l   d4
  13195.   SUB.l   d4,d6 ; For end
  13196.   MOVE.w  CRsrc_ClipLMod-ChunkyResources(a0),d4
  13197.   EXT.l   d4
  13198.   SUB.l   d4,d6 ; For end
  13199.   MOVE.l  d6,d4 ; Store
  13200.   ADD.l   CRsrc_ClipBytes-ChunkyResources(a0),d5 ; Lowest address
  13201.   ADD.l   d5,d6 ; Highest address (1 past)
  13202. _MWrapYParticlesAClipLoop
  13203.     MOVE.l  (a1),d3 ; Get long
  13204.     CMP.l   d5,d3 ; Lower?
  13205.     BLT     _MWrapYParticlesAClipSkip1
  13206.     CMP.l   d6,d3 ; Higher or equal?
  13207.     BGE     _MWrapYParticlesAClipSkip2
  13208.     ADD.w   #4,a1
  13209.     SUBQ.l  #1,d1 ; Next pixel
  13210.     BGT     _MWrapYParticlesAClipLoop
  13211.   RTS
  13212. _MWrapYParticlesAClipSkip1
  13213.     ADD.l   d4,d3 ; Address+Bytes
  13214.     MOVE.l  d3,(a1)+ ; Write address
  13215.     SUBQ.l  #1,d1 ; Next pixel
  13216.     BGT     _MWrapYParticlesAClipLoop
  13217.   RTS
  13218. _MWrapYParticlesAClipSkip2
  13219.     SUB.l   d4,d3 ; Address-Bytes
  13220.     MOVE.l  d3,(a1)+ ; Write address
  13221.     SUBQ.l  #1,d1 ; Next pixel
  13222.     BGT     _MWrapYParticlesAClipLoop
  13223.   RTS
  13224.  
  13225. _MWrapYParticlesQ
  13226. ;Wrap Y.q component of X.q,Y.q particles around the top and bottom of the bitmap. Particles reappear at opposite edge
  13227.   MOVE.l  d0,a1 ; Coordinate list
  13228.   MOVE.w  CurrentChunkyBitmap1,d0
  13229.   !GetBitmapObjectPtr ; Base in a0
  13230.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  13231.   BNE     _MWrapYParticlesQClip
  13232.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d5 ; Width X2
  13233.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d6 ; Height Y2
  13234.   ADD.w   #4,a1 ; Skip first X
  13235. _MWrapYParticlesQLoop
  13236.     MOVE.w  (a1),d4 ; Read, Y<0?
  13237.     BLT     _MWrapYParticlesQSkip1
  13238.     CMP.w   d6,d4 ; Y>=Y2?
  13239.     BGE     _MWrapYParticlesQSkip2
  13240.     ADD.w   #8,a1
  13241.     SUBQ.l  #1,d1 ; Next pixel
  13242.     BGT     _MWrapYParticlesQLoop
  13243.   RTS
  13244. _MWrapYParticlesQSkip1
  13245.     ADD.w   d6,d4 ; Y+Height
  13246.     MOVE.w  d4,(a1) ; Write Y
  13247.     ADD.w   #8,a1
  13248.     SUBQ.l  #1,d1 ; Next pixel
  13249.     BGT     _MWrapYParticlesQLoop
  13250.   RTS
  13251. _MWrapYParticlesQSkip2
  13252.     SUB.w   d6,d4 ; Y-Height
  13253.     MOVE.w  d4,(a1) ; Write Y
  13254.     ADD.w   #8,a1
  13255.     SUBQ.l  #1,d1 ; Next pixel
  13256.     BGT     _MWrapYParticlesQLoop
  13257.   RTS
  13258. _MWrapYParticlesQClip
  13259. ;Only wrap the particles that are outside of the clip window
  13260.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  13261.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  13262.   MOVE.w  d6,d2 ; Store height
  13263.   ADD.w   d4,d6 ; Y2 outside of window
  13264.   ADD.w   #4,a1 ; Skip first X
  13265. _MWrapYParticlesQClipLoop
  13266.     MOVE.w  (a1),d7 ; Get y
  13267.     CMP.w   d4,d7 ; Y<Y1?
  13268.     BLT     _MWrapYParticlesQClipSkip1
  13269.     CMP.w   d6,d7 ; Y>=Y2?
  13270.     BGE     _MWrapYParticlesQClipSkip2
  13271.     ADD.w   #8,a1
  13272.     SUBQ.l  #1,d1 ; Next pixel
  13273.     BGT     _MWrapYParticlesQClipLoop
  13274.   RTS
  13275. _MWrapYParticlesQClipSkip1
  13276.     ADD.w   d2,d7 ; Y+Height
  13277.     MOVE.w  d7,(a1) ; Write Y
  13278.     ADD.w   #8,a1
  13279.     SUBQ.l  #1,d1 ; Next pixel
  13280.     BGT     _MWrapYParticlesQClipLoop
  13281.   RTS
  13282. _MWrapYParticlesQClipSkip2
  13283.     SUB.w   d2,d7 ; Y-Height
  13284.     MOVE.w  d7,4(a1) ; Write Y
  13285.     ADD.w   #8,a1
  13286.     SUBQ.l  #1,d1 ; Next pixel
  13287.     BGT     _MWrapYParticlesQClipLoop
  13288.   RTS
  13289.  
  13290. ;*************************************************************************************
  13291.  
  13292. _MAddToXParticlesShort
  13293.   MOVEQ.l #0,d3 ; No second list
  13294. _MAddToXParticles
  13295. ;Add X.w increments to X.w coords and ignore Y increments/coords, in particle list
  13296.   TST.b   _ParticleFormat ; What format?
  13297.   BLT     _MAddToXParticlesQ ; Data is in X.q,Y.q format
  13298.   BGT     _MAddToXParticlesA ; Data is in Ptr.l format
  13299.   ;Data is in X.w,Y.w format
  13300.   MOVE.l  d0,a2 ; Particle list
  13301.   MOVE.l  d2,a1 ; Increment list A
  13302.   MOVE.w  CurrentChunkyBitmap1,d0
  13303.   !GetBitmapObjectPtr ; Base in a0
  13304.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  13305.   BNE     _MAddToXParticlesClip
  13306.   TST.l   d3 ; Two adds?
  13307.   BNE     _MAddToXParticles2
  13308.   MOVEQ.l #4,d7 ; Skip value
  13309. _MAddToXParticlesLoop
  13310.     MOVE.w  (a1),d3 ; Read
  13311.     ADD.w   d7,a1
  13312.     ADD.w   d3,(a2) ; X.w+XAdder.w
  13313.     ADD.w   d7,a2
  13314.     SUBQ.l  #1,d1 ; Next pixel
  13315.     BGT     _MAddToXParticlesLoop
  13316.   RTS
  13317. _MAddToXParticles2
  13318.   MOVE.l  a3,-(a7) ; Store
  13319.   MOVE.l  d3,a3 ; a3=Increment list B
  13320.   MOVEQ.l #4,d7 ; Skip value
  13321. _MAddToXParticles2Loop
  13322.     MOVE.w  (a2),d3 ; Read list
  13323.     ADD.w   (a1),d3 ; X.w+XAdderA.w
  13324.     ADD.w   d7,a1
  13325.     ADD.w   (a3),d3 ; X.w+XAdderB.w
  13326.     ADD.w   d7,a3
  13327.     MOVE.w  d3,(a2) ; Write
  13328.     ADD.w   d7,a2
  13329.     SUBQ.l  #1,d1 ; Next pixel
  13330.     BGT     _MAddToXParticles2Loop
  13331.   MOVE.l  (a7)+,a3 ; Restore
  13332.   RTS
  13333. _MAddToXParticlesClip
  13334. ;Only move the particles that are within the clip window
  13335.   TST.l   d3 ; Two adds?
  13336.   BNE     _MAddToXParticlesClip2
  13337.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  13338.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  13339.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  13340.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  13341.   ADD.w   d3,d5 ; X2 outside of window
  13342.   ADD.w   d4,d6 ; Y2 outside of window
  13343.   MOVEQ.l #4,d7 ; Skip value
  13344. _MAddToXParticlesClipLoop
  13345.     MOVE.w  (a2),d0 ; Get x
  13346.     CMP.w   d3,d0 ; X<X1?
  13347.     BLT     _MAddToXParticlesClipSkip
  13348.     CMP.w   d5,d0 ; X>=X2?
  13349.     BGE     _MAddToXParticlesClipSkip
  13350.     MOVE.w  2(a2),d2 ; Get y
  13351.     CMP.w   d4,d2 ; Y<Y1?
  13352.     BLT     _MAddToXParticlesClipSkip
  13353.     CMP.w   d6,d2 ; Y>=Y2?
  13354.     BGE     _MAddToXParticlesClipSkip
  13355.     ADD.w   (a1),d0 ; X.w+XAdder.w
  13356.     ADD.w   d7,a1
  13357.     MOVE.w  d0,(a2) ; Write X
  13358.     ADD.w   d7,a2
  13359.     SUBQ.l  #1,d1 ; Next pixel
  13360.     BGT     _MAddToXParticlesClipLoop
  13361.   RTS;pop
  13362. _MAddToXParticlesClipSkip
  13363.     ADD.w   d7,a1
  13364.     ADD.w   d7,a2
  13365.     SUBQ.l  #1,d1 ; Next pixel
  13366.     BGT     _MAddToXParticlesClipLoop
  13367.   RTS;pop
  13368. _MAddToXParticlesClip2
  13369.   MOVE.l  a3,-(a7) ; Store
  13370.   MOVE.l  d3,a3 ; a3=Increment list B
  13371.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  13372.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  13373.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  13374.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  13375.   ADD.w   d3,d5 ; X2 outside of window
  13376.   ADD.w   d4,d6 ; Y2 outside of window
  13377.   MOVEQ.l #4,d7 ; Skip value
  13378. _MAddToXParticlesClip2Loop
  13379.     MOVE.w  (a2),d0 ; Get x
  13380.     CMP.w   d3,d0 ; X<X1?
  13381.     BLT     _MAddToXParticlesClip2Skip
  13382.     CMP.w   d5,d0 ; X>=X2?
  13383.     BGE     _MAddToXParticlesClip2Skip
  13384.     MOVE.w  2(a2),d2 ; Get y
  13385.     CMP.w   d4,d2 ; Y<Y1?
  13386.     BLT     _MAddToXParticlesClip2Skip
  13387.     CMP.w   d6,d2 ; Y>=Y2?
  13388.     BGE     _MAddToXParticlesClip2Skip
  13389.     ADD.w   (a1),d0 ; X.w+XAdderA.w
  13390.     ADD.w   d7,a1
  13391.     ADD.w   (a3),d0 ; X.w+XAdderB.w
  13392.     ADD.w   d7,a3
  13393.     MOVE.w  d0,(a2) ; Write X
  13394.     ADD.w   d7,a2
  13395.     SUBQ.l  #1,d1 ; Next pixel
  13396.     BGT     _MAddToXParticlesClip2Loop
  13397.   MOVE.l  (a7)+,a3 ; Restore
  13398.   RTS;pop
  13399. _MAddToXParticlesClip2Skip
  13400.     ADD.w   d7,a1
  13401.     ADD.w   d7,a3
  13402.     ADD.w   d7,a2
  13403.     SUBQ.l  #1,d1 ; Next pixel
  13404.     BGT     _MAddToXParticlesClip2Loop
  13405.   MOVE.l  (a7)+,a3 ; Restore
  13406.   RTS
  13407.  
  13408. _MAddToXParticlesA
  13409.   ; Can't add X to Ptr.l (use MAddToParticles with MParticleFormat 1 )
  13410.   RTS
  13411.  
  13412. _MAddToXParticlesQ
  13413. ;Add X.q increments to X.q coords, and ignore Y.q increments/coords, in particle list
  13414.   MOVE.l  d0,a2 ; Particle list
  13415.   MOVE.l  d2,a1 ; Increment list
  13416.   MOVE.w  CurrentChunkyBitmap1,d0
  13417.   !GetBitmapObjectPtr ; Base in a0
  13418.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  13419.   BNE     _MAddToXParticlesQClip
  13420.   TST.l   d3 ; Second list?
  13421.   BNE     _MAddToXParticlesQ2
  13422.   MOVEQ.l #8,d7 ; Skip value
  13423. _MAddToXParticlesQLoop
  13424.     MOVE.l  (a1),d3 ; Read
  13425.     ADD.w   d7,a1
  13426.     ADD.l   d3,(a2) ; X.q+XAdder.q
  13427.     ADD.w   d7,a2
  13428.     SUBQ.l  #1,d1 ; Next pixel
  13429.     BGT     _MAddToXParticlesQLoop
  13430.   RTS
  13431. _MAddToXParticlesQ2
  13432.   MOVE.l  a3,-(a7) ; Store
  13433.   MOVE.l  d3,a3 ; a3=Second list
  13434.   MOVEQ.l #8,d7
  13435. _MAddToXParticlesQ2Loop
  13436.     MOVE.l  (a2),d3  ; Read
  13437.     ADD.w   d7,a2
  13438.     ADD.l   (a1),d3 ; X.q+XAdderA.q
  13439.     ADD.w   d7,a1
  13440.     ADD.l   (a3),d3 ; X.q+XAdderA.q
  13441.     ADD.w   d7,a3
  13442.     MOVE.l  d3,(a2) ; Write X
  13443.     SUBQ.l  #1,d1 ; Next pixel
  13444.     BGT     _MAddToXParticlesQ2Loop
  13445.   MOVE.l  (a7)+,a3 ; Restore
  13446.   RTS
  13447. _MAddToXParticlesQClip
  13448. ;Only move the particles that are within the clip window
  13449.   TST.l   d3 ; Two lists?
  13450.   BNE     _MAddToXParticlesQClip2
  13451.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  13452.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  13453.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  13454.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  13455.   ADD.w   d3,d5 ; X2 outside of window
  13456.   ADD.w   d4,d6 ; Y2 outside of window
  13457.   MOVEQ.l #8,d7 ; Skip value
  13458. _MAddToXParticlesQClipLoop
  13459.     MOVE.w  (a2),d0 ; Get x
  13460.     CMP.w   d3,d0 ; X<X1?
  13461.     BLT     _MAddToXParticlesQClipSkip
  13462.     CMP.w   d5,d0 ; X>=X2?
  13463.     BGE     _MAddToXParticlesQClipSkip
  13464.     MOVE.w  4(a2),d2 ; Get y
  13465.     CMP.w   d4,d2 ; Y<Y1?
  13466.     BLT     _MAddToXParticlesQClipSkip
  13467.     CMP.w   d6,d2 ; Y>=Y2?
  13468.     BGE     _MAddToXParticlesQClipSkip
  13469.     SWAP    d0 ; Make integer portion of x
  13470.     MOVE.w  2(a2),d0 ; Get decimal portion of x
  13471.     ADD.l   (a1),d0 ; X.q=XAdder.q
  13472.     ADD.w   d7,a1
  13473.     MOVE.l  d0,(a2) ; Write
  13474.     ADD.w   d7,a2
  13475.     SUBQ.l  #1,d1 ; Next pixel
  13476.     BGT     _MAddToXParticlesQClipLoop
  13477.   RTS;pop
  13478. _MAddToXParticlesQClipSkip
  13479.     ADD.w   d7,a1
  13480.     ADD.w   d7,a2
  13481.     SUBQ.l  #1,d1 ; Next pixel
  13482.     BGT     _MAddToXParticlesQClipLoop
  13483.   RTS
  13484. _MAddToXParticlesQClip2
  13485.   MOVE.l  a3,-(a7) ; Store
  13486.   MOVE.l  d3,a3 ; a3=Second list
  13487.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  13488.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  13489.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  13490.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  13491.   ADD.w   d3,d5 ; X2 outside of window
  13492.   ADD.w   d4,d6 ; Y2 outside of window
  13493.   MOVEQ.l #8,d7 ; Skip value
  13494. _MAddToXParticlesQClip2Loop
  13495.     MOVE.w  (a2),d0 ; Get x
  13496.     CMP.w   d3,d0 ; X<X1?
  13497.     BLT     _MAddToXParticlesQClip2Skip
  13498.     CMP.w   d5,d0 ; X>=X2?
  13499.     BGE     _MAddToXParticlesQClip2Skip
  13500.     MOVE.w  4(a2),d2 ; Get y
  13501.     CMP.w   d4,d2 ; Y<Y1?
  13502.     BLT     _MAddToXParticlesQClip2Skip
  13503.     CMP.w   d6,d2 ; Y>=Y2?
  13504.     BGE     _MAddToXParticlesQClip2Skip
  13505.     SWAP    d0 ; Make integer portion of x
  13506.     MOVE.w  2(a2),d0 ; Get decimal portion of x
  13507.     ADD.l   (a1),d0 ; X.q+XAdderA.q
  13508.     ADD.w   d7,a1
  13509.     ADD.l   (a3)+,d0 ; X.q+XAdderB.q
  13510.     ADD.w   d7,a3
  13511.     MOVE.l  d0,(a2) ; Write X
  13512.     ADD.w   d7,a2
  13513.     SUBQ.l  #1,d1 ; Next pixel
  13514.     BGT     _MAddToXParticlesQClip2Loop
  13515.   MOVE.l  (a7)+,a3 ; Restore
  13516.   RTS;pop
  13517. _MAddToXParticlesQClip2Skip
  13518.     ADD.w   d7,a1
  13519.     ADD.w   d7,a2
  13520.     ADD.w   d7,a3
  13521.     SUBQ.l  #1,d1 ; Next pixel
  13522.     BGT     _MAddToXParticlesQClip2Loop
  13523.   MOVE.l  (a7)+,a3 ; Restore
  13524.   RTS
  13525.  
  13526. ;*************************************************************************************
  13527.  
  13528. _MAddToYParticlesShort
  13529.   MOVEQ.l #0,d3 ; No second list
  13530. _MAddToYParticles
  13531. ;Add Y.w increments to Y.w coords, and ignore X.w increments/ coords, in particle list
  13532.   TST.b   _ParticleFormat ; What format?
  13533.   BLT     _MAddToYParticlesQ ; Data is in X.q,Y.q format
  13534.   BGT     _MAddToYParticlesA ; Data is in Ptr.l format
  13535.   ;Data is in X.w,Y.w format
  13536.   MOVE.l  d0,a2 ; Particle list
  13537.   MOVE.l  d2,a1 ; Increment list A
  13538.   MOVE.w  CurrentChunkyBitmap1,d0
  13539.   !GetBitmapObjectPtr ; Base in a0
  13540.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  13541.   BNE     _MAddToYParticlesClip
  13542.   TST.l   d3 ; Two adds?
  13543.   BNE     _MAddToYParticles2
  13544.   ADD.w   #2,a1 ; Skip first X
  13545.   ADD.w   #2,a2 ; Skip first X
  13546.   MOVEQ.l #4,d7 ; Skip value
  13547. _MAddToYParticlesLoop
  13548.     MOVE.w  (a1),d4 ; Read
  13549.     ADD.w   d7,a1
  13550.     ADD.w   d4,(a2) ; Y.w+YAdder.w
  13551.     ADD.w   d7,a2
  13552.     SUBQ.l  #1,d1 ; Next pixel
  13553.     BGT     _MAddToYParticlesLoop
  13554.   RTS
  13555. _MAddToYParticles2
  13556.   MOVE.l  a3,-(a7) ; Store
  13557.   MOVE.l  d3,a3 ; a3=Increment list B
  13558.   ADD.w   #2,a1 ; Skip first X
  13559.   ADD.w   #2,a2 ; Skip first X
  13560.   ADD.w   #2,a3 ; Skip first X
  13561.   MOVEQ.l #4,d7 ; Skip value
  13562. _MAddToYParticles2Loop
  13563.     MOVE.w  (a2),d4 ; Read list
  13564.     ADD.w   (a1),d4 ; Y.w+YAdderA.w
  13565.     ADD.w   d7,a1
  13566.     ADD.w   (a3),d4 ; Y.w+YAdderB.w
  13567.     ADD.w   d7,a3
  13568.     MOVE.w  d4,(a2) ; Write
  13569.     ADD.w   d7,a2
  13570.     SUBQ.l  #1,d1 ; Next pixel
  13571.     BGT     _MAddToYParticles2Loop
  13572.   MOVE.l  (a7)+,a3 ; Restore
  13573.   RTS
  13574. _MAddToYParticlesClip
  13575. ;Only move the particles that are within the clip window
  13576.   TST.l   d3 ; Two adds?
  13577.   BNE     _MAddToParticlesClip2
  13578.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  13579.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  13580.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  13581.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  13582.   ADD.w   d3,d5 ; X2 outside of window
  13583.   ADD.w   d4,d6 ; Y2 outside of window
  13584.   ADD.w   #2,a1 ; Skip first X
  13585.   MOVEQ.l #4,d7 ; Skip value
  13586. _MAddToYParticlesClipLoop
  13587.     MOVE.w  (a2),d0 ; Get x
  13588.     CMP.w   d3,d0 ; X<X1?
  13589.     BLT     _MAddToYParticlesClipSkip
  13590.     CMP.w   d5,d0 ; X>=X2?
  13591.     BGE     _MAddToYParticlesClipSkip
  13592.     MOVE.w  2(a2),d2 ; Get y
  13593.     CMP.w   d4,d2 ; Y<Y1?
  13594.     BLT     _MAddToYParticlesClipSkip
  13595.     CMP.w   d6,d2 ; Y>=Y2?
  13596.     BGE     _MAddToYParticlesClipSkip
  13597.     ADD.w   (a1),d2 ; Y.w+YAdder.w
  13598.     ADD.w   d7,a1
  13599.     MOVE.w  d2,2(a2) ; Write
  13600.     ADD.w   d7,a2
  13601.     SUBQ.l  #1,d1 ; Next pixel
  13602.     BGT     _MAddToYParticlesClipLoop
  13603.   RTS;pop
  13604. _MAddToYParticlesClipSkip
  13605.     ADD.w   d7,a1
  13606.     ADD.w   d7,a2
  13607.     SUBQ.l  #1,d1 ; Next pixel
  13608.     BGT     _MAddToYParticlesClipLoop
  13609.   RTS;pop
  13610. _MAddToYParticlesClip2
  13611.   MOVE.l  a3,-(a7) ; Store
  13612.   MOVE.l  d3,a3 ; a3=Increment list B
  13613.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  13614.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  13615.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  13616.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  13617.   ADD.w   d3,d5 ; X2 outside of window
  13618.   ADD.w   d4,d6 ; Y2 outside of window
  13619.   ADD.w   #2,a1 ; Skip first X
  13620.   ADD.w   #2,a3 ; Skip first X
  13621.   MOVEQ.l #4,d7 ; Skip value
  13622. _MAddToYParticlesClip2Loop
  13623.     MOVE.w  (a2),d0 ; Get x
  13624.     CMP.w   d3,d0 ; X<X1?
  13625.     BLT     _MAddToYParticlesClip2Skip
  13626.     CMP.w   d5,d0 ; X>=X2?
  13627.     BGE     _MAddToYParticlesClip2Skip
  13628.     MOVE.w  2(a2),d2 ; Get y
  13629.     CMP.w   d4,d2 ; Y<Y1?
  13630.     BLT     _MAddToYParticlesClip2Skip
  13631.     CMP.w   d6,d2 ; Y>=Y2?
  13632.     BGE     _MAddToYParticlesClip2Skip
  13633.     ADD.w   (a1),d2 ; Y.w+YAdderA.w
  13634.     ADD.w   d7,a1
  13635.     ADD.w   (a3),d2 ; Y.w+YAdderB.w
  13636.     ADD.w   d7,a3
  13637.     MOVE.w  d2,2(a2) ; Write
  13638.     ADD.w   d7,a2
  13639.     SUBQ.l  #1,d1 ; Next pixel
  13640.     BGT     _MAddToYParticlesClip2Loop
  13641.   MOVE.l  (a7)+,a3 ; Restore
  13642.   RTS;pop
  13643. _MAddToYParticlesClip2Skip
  13644.     ADD.w   d7,a1
  13645.     ADD.w   d7,a3
  13646.     ADD.w   d7,a2
  13647.     SUBQ.l  #1,d1 ; Next pixel
  13648.     BGT     _MAddToYParticlesClip2Loop
  13649.   MOVE.l  (a7)+,a3 ; Restore
  13650.   RTS
  13651.  
  13652. _MAddToYParticlesA
  13653.   ; Can't add Y to Ptr.l (use MAddToParticles and MParticleFormat 1 )
  13654.   RTS
  13655.  
  13656. _MAddToYParticlesQ
  13657. ;Add Y.q increments to Y.q coords, and ignore X.q increments/coords, in particle list
  13658.   MOVE.l  d0,a2 ; Particle list
  13659.   MOVE.l  d2,a1 ; Increment list
  13660.   MOVE.w  CurrentChunkyBitmap1,d0
  13661.   !GetBitmapObjectPtr ; Base in a0
  13662.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  13663.   BNE     _MAddToYParticlesQClip
  13664.   TST.l   d3 ; Second list?
  13665.   BNE     _MAddToYParticlesQ2
  13666.   ADD.w   #4,a1 ; Skip first X
  13667.   ADD.w   #4,a2 ; Skip first X
  13668.   MOVEQ.l #8,d7 ; Skip value
  13669. _MAddToYParticlesQLoop
  13670.     MOVE.l  (a1),d4 ; Read
  13671.     ADD.w   d7,a1
  13672.     ADD.l   d4,(a2) ; Y.q+YAdder.q
  13673.     ADD.w   d7,a2
  13674.     SUBQ.l  #1,d1 ; Next pixel
  13675.     BGT     _MAddToYParticlesQLoop
  13676.   RTS
  13677. _MAddToYParticlesQ2
  13678.   MOVE.l  a3,-(a7) ; Store
  13679.   MOVE.l  d3,a3 ; a3=Second list
  13680.   ADD.w   #4,a1 ; Skip first X
  13681.   ADD.w   #4,a2 ; Skip first X
  13682.   ADD.w   #4,a3 ; Skip first X
  13683.   MOVEQ.l #8,d7 ; Skip value
  13684. _MAddToYParticlesQ2Loop
  13685.     MOVE.l  (a2),d4 ; Read
  13686.     ADD.l   (a1),d4 ; Y.q+YAdderA.q
  13687.     ADD.w   d7,a1
  13688.     ADD.l   (a3),d4 ; Y.q+YAdderB.q
  13689.     ADD.w   d7,a3
  13690.     MOVE.l  d4,(a2) ; Write
  13691.     ADD.w   d7,a2
  13692.     SUBQ.l  #1,d1 ; Next pixel
  13693.     BGT     _MAddToYParticlesQ2Loop
  13694.   MOVE.l  (a7)+,a3 ; Restore
  13695.   RTS
  13696. _MAddToYParticlesQClip
  13697. ;Only move the particles that are within the clip window
  13698.   TST.l   d3 ; Two lists?
  13699.   BNE     _MAddToYParticlesQClip2
  13700.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  13701.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  13702.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  13703.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  13704.   ADD.w   d3,d5 ; X2 outside of window
  13705.   ADD.w   d4,d6 ; Y2 outside of window
  13706.   ADD.w   #4,a1 ; Skip first X
  13707.   MOVEQ.l #8,d7 ; Skip value
  13708. _MAddToYParticlesQClipLoop
  13709.     MOVE.w  (a2),d0 ; Get x
  13710.     CMP.w   d3,d0 ; X<X1?
  13711.     BLT     _MAddToYParticlesQClipSkip
  13712.     CMP.w   d5,d0 ; X>=X2?
  13713.     BGE     _MAddToYParticlesQClipSkip
  13714.     MOVE.w  4(a2),d2 ; Get y
  13715.     CMP.w   d4,d2 ; Y<Y1?
  13716.     BLT     _MAddToYParticlesQClipSkip
  13717.     CMP.w   d6,d2 ; Y>=Y2?
  13718.     BGE     _MAddToYParticlesQClipSkip
  13719.     SWAP    d0 ; Make integer portion of x
  13720.     SWAP    d2 ; Make integer portion of y
  13721.     MOVE.w  2(a2),d0 ; Get decimal portion of x
  13722.     MOVE.w  6(a2),d2 ; Get decimal portion of y
  13723.     ADD.l   (a1),d2 ; Y.q+YAdder.q
  13724.     ADD.w   d7,a1
  13725.     MOVE.l  d2,(a2) ; Write
  13726.     ADD.w   d7,a2
  13727.     SUBQ.l  #1,d1 ; Next pixel
  13728.     BGT     _MAddToYParticlesQClipLoop
  13729.   RTS;pop
  13730. _MAddToYParticlesQClipSkip
  13731.     ADD.w   d7,a1
  13732.     ADD.w   d7,a2
  13733.     SUBQ.l  #1,d1 ; Next pixel
  13734.     BGT     _MAddToYParticlesQClipLoop
  13735.   RTS
  13736. _MAddToYParticlesQClip2
  13737.   MOVE.l  a3,-(a7) ; Store
  13738.   MOVE.l  d3,a3 ; a3=Second list
  13739.   MOVE.w  CRsrc_ClipLeft-ChunkyResources(a0),d3 ; X1
  13740.   MOVE.w  CRsrc_ClipTop-ChunkyResources(a0),d4 ; Y1
  13741.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d5 ; Width
  13742.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d6 ; Height
  13743.   ADD.w   d3,d5 ; X2 outside of window
  13744.   ADD.w   d4,d6 ; Y2 outside of window
  13745.   ADD.w   #4,a1 ; Skip first X
  13746.   ADD.w   #4,a3 ; Skip first X
  13747.   MOVEQ.l #8,d7 ; Skip value
  13748. _MAddToYParticlesQClip2Loop
  13749.     MOVE.w  (a2),d0 ; Get x
  13750.     CMP.w   d3,d0 ; X<X1?
  13751.     BLT     _MAddToYParticlesQClip2Skip
  13752.     CMP.w   d5,d0 ; X>=X2?
  13753.     BGE     _MAddToYParticlesQClip2Skip
  13754.     MOVE.w  4(a2),d2 ; Get y
  13755.     CMP.w   d4,d2 ; Y<Y1?
  13756.     BLT     _MAddToYParticlesQClip2Skip
  13757.     CMP.w   d6,d2 ; Y>=Y2?
  13758.     BGE     _MAddToYParticlesQClip2Skip
  13759.     SWAP    d0 ; Make integer portion of x
  13760.     SWAP    d2 ; Make integer portion of y
  13761.     MOVE.w  2(a2),d0 ; Get decimal portion of x
  13762.     MOVE.w  6(a2),d0 ; Get decimal portion of y
  13763.     ADD.l   (a1),d2 ; Y.q+YAdderA.q
  13764.     ADD.w   d7,a1
  13765.     ADD.l   (a3),d2 ; Y.q+YAdderB.q
  13766.     ADD.w   d7,a3
  13767.     MOVE.l  d2,(a2)+ ; Write
  13768.     ADD.w   d7,a2
  13769.     SUBQ.l  #1,d1 ; Next pixel
  13770.     BGT     _MAddToYParticlesQClip2Loop
  13771.   MOVE.l  (a7)+,a3 ; Restore
  13772.   RTS;pop
  13773. _MAddToYParticlesQClip2Skip
  13774.     ADD.w   d7,a1
  13775.     ADD.w   d7,a2
  13776.     ADD.w   d7,a3
  13777.     SUBQ.l  #1,d1 ; Next pixel
  13778.     BGT     _MAddToYParticlesQClip2Loop
  13779.   MOVE.l  (a7)+,a3 ; Restore
  13780.   RTS
  13781.  
  13782. ;*************************************************************************************
  13783.  
  13784. _MZoomShort
  13785.   MOVEM.l a3-a6,-(a7) ; Store
  13786.   MOVE.l  d0,a5 ; a5=SrcX.q
  13787.   MOVE.l  d1,a6 ; a6=SrcY.q
  13788.   MOVE.w  CurrentChunkyBitmap1,d0 ; Dest bitmap
  13789.   !GetBitmapObjectPtr ; Base in a0 - source
  13790.   MOVE.l  a0,a1 ; Dest
  13791.   BRA     _MZoomJump
  13792. _MZoom
  13793.   MOVEM.l a3-a6,-(a7) ; Store
  13794.   MOVE.l  d0,a5 ; a5=SrcX.q
  13795.   MOVE.l  d1,a6 ; a6=SrcY.q
  13796.   MOVE.w  CurrentChunkyBitmap1,d0 ; Dest bitmap
  13797.   !GetBitmapObjectPtr ; Base in a0
  13798.   MOVE.l  a0,a1 ; Dest
  13799.   MOVE.w  -8(a2),d0 ; Source bitmap
  13800.   !GetBitmapObjectPtr; Base in a0 - source
  13801. _MZoomJump
  13802.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a3 ; Source data
  13803.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a4 ; Dest data
  13804.   BSR     PerformZoom
  13805.   MOVEM.l (a7)+,a3-a6 ; Restore
  13806.   RTS
  13807. _MZoomCustom
  13808.   MOVEM.l a3-a6,-(a7) ; Store
  13809.   MOVE.l  d0,a5 ; a5=SrcX.q
  13810.   MOVE.l  d1,a6 ; a6=SrcY.q
  13811.   MOVE.w  CurrentChunkyBitmap1,d0 ; Dest bitmap
  13812.   !GetBitmapObjectPtr ; Base in a0
  13813.   MOVE.l  a0,a1 ; Dest
  13814.   MOVE.w  -8(a2),d0 ; Source bitmap
  13815.   !GetBitmapObjectPtr; Base in a0 - source
  13816.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a3 ; Source data
  13817.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a4 ; Dest data
  13818.   BSR     PerformCustomZoom
  13819.   MOVEM.l (a7)+,a3-a6 ; Restore
  13820.   RTS
  13821.  
  13822. ;*************************************************************************************
  13823.  
  13824. _MZoomShapeShort
  13825.   MOVEM.l a3-a6,-(a7) ; Store
  13826.   MOVE.l  d0,a5 ; a5=SrcX.q
  13827.   MOVE.l  d1,a6 ; a6=SrcY.q
  13828.   MOVE.w  CurrentChunkyShape1,d0 ; Dest shap
  13829.   !GetShapeObjectPtr ; Base in a0 - source
  13830.   MOVE.l  a0,a1 ; Dest
  13831.   BRA     _MZoomShapeJump
  13832. _MZoomShape
  13833.   MOVEM.l a3-a6,-(a7) ; Store
  13834.   MOVE.l  d0,a5 ; a5=SrcX.q
  13835.   MOVE.l  d1,a6 ; a6=SrcY.q
  13836.   MOVE.w  CurrentChunkyShape1,d0 ; Dest shape
  13837.   !GetShapeObjectPtr ; Base in a0
  13838.   MOVE.l  a0,a1 ; Dest
  13839.   MOVE.w  -8(a2),d0 ; Source shape
  13840.   !GetShapeObjectPtr; Base in a0 - source
  13841. _MZoomShapeJump
  13842.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a3 ; Source data
  13843.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a4 ; Dest data
  13844.   BSR     PerformZoom
  13845.   MOVEM.l (a7)+,a3-a6 ; Restore
  13846.   RTS
  13847. _MZoomShapeCustom
  13848.   MOVEM.l a3-a6,-(a7) ; Store
  13849.   MOVE.l  d0,a5 ; a5=SrcX.q
  13850.   MOVE.l  d1,a6 ; a6=SrcY.q
  13851.   MOVE.w  CurrentChunkyShape1,d0 ; Dest shape
  13852.   !GetShapeObjectPtr ; Base in a0
  13853.   MOVE.l  a0,a1 ; Dest
  13854.   MOVE.w  -8(a2),d0 ; Source shape
  13855.   !GetShapeObjectPtr; Base in a0 - source
  13856.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a3 ; Source data
  13857.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a4 ; Dest data
  13858.   BSR     PerformCustomZoom
  13859.   MOVEM.l (a7)+,a3-a6 ; Restore
  13860.   RTS
  13861.  
  13862. ;*************************************************************************************
  13863.  
  13864. _MZoomBitmapToShapeShort
  13865.   MOVEM.l a3-a6,-(a7) ; Store
  13866.   MOVE.l  d0,a5 ; a5=SrcX.q
  13867.   MOVE.l  d1,a6 ; a6=SrcY.q
  13868.   MOVE.w  CurrentChunkyShape1,d0 ; Dest shape
  13869.   !GetShapeObjectPtr ; Base in a0
  13870.   MOVE.l  a0,a1 ; Dest
  13871.   MOVE.w  CurrentChunkyBitmap1,d0 ; Source bitmap
  13872.   !GetBitmapObjectPtr ; Base in a0 - source
  13873.   BRA     _MZoomBitmapToShapeJump
  13874. _MZoomBitmapToShape
  13875.   MOVEM.l a3-a6,-(a7) ; Store
  13876.   MOVE.l  d0,a5 ; a5=SrcX.q
  13877.   MOVE.l  d1,a6 ; a6=SrcY.q
  13878.   MOVE.w  CurrentChunkyShape1,d0 ; Dest shape
  13879.   !GetShapeObjectPtr ; Base in a0
  13880.   MOVE.l  a0,a1 ; Dest
  13881.   MOVE.w  -8(a2),d0 ; Source bitmap
  13882.   !GetBitmapObjectPtr; Base in a0 - source
  13883. _MZoomBitmapToShapeJump
  13884.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a3 ; Source data
  13885.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a4 ; Dest data
  13886.   BSR     PerformZoom
  13887.   MOVEM.l (a7)+,a3-a6 ; Restore
  13888.   RTS
  13889. _MZoomBitmapToShapeCustom
  13890.   MOVEM.l a3-a6,-(a7) ; Store
  13891.   MOVE.l  d0,a5 ; a5=SrcX.q
  13892.   MOVE.l  d1,a6 ; a6=SrcY.q
  13893.   MOVE.w  CurrentChunkyShape1,d0 ; Dest shape
  13894.   !GetShapeObjectPtr ; Base in a0
  13895.   MOVE.l  a0,a1 ; Dest
  13896.   MOVE.w  -8(a2),d0 ; Source bitmap
  13897.   !GetBitmapObjectPtr; Base in a0 - source
  13898.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a3 ; Source data
  13899.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a4 ; Dest data
  13900.   BSR     PerformCustomZoom
  13901.   MOVEM.l (a7)+,a3-a6 ; Restore
  13902.   RTS
  13903.  
  13904. ;*************************************************************************************
  13905.  
  13906. _MZoomShapeToBitmapShort
  13907.   MOVEM.l a3-a6,-(a7) ; Store
  13908.   MOVE.l  d0,a5 ; a5=SrcX.q
  13909.   MOVE.l  d1,a6 ; a6=SrcY.q
  13910.   MOVE.w  CurrentChunkyBitmap1,d0 ; Dest bitmap
  13911.   !GetBitmapObjectPtr ; Base in a0
  13912.   MOVE.l  a0,a1 ; Dest
  13913.   MOVE.w  CurrentChunkyShape1,d0 ; Source shape
  13914.   !GetShapeObjectPtr ; Base in a0 - source
  13915.   BRA     _MZoomShapeToBitmapJump
  13916. _MZoomShapeToBitmap
  13917.   MOVEM.l a3-a6,-(a7) ; Store
  13918.   MOVE.l  d0,a5 ; a5=SrcX.q
  13919.   MOVE.l  d1,a6 ; a6=SrcY.q
  13920.   MOVE.w  CurrentChunkyBitmap1,d0 ; Dest bitmap
  13921.   !GetBitmapObjectPtr ; Base in a0
  13922.   MOVE.l  a0,a1 ; Dest
  13923.   MOVE.w  -8(a2),d0 ; Source shape
  13924.   !GetShapeObjectPtr; Base in a0 - source
  13925. _MZoomShapeToBitmapJump
  13926.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a3 ; Source data
  13927.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a4 ; Dest data
  13928.   BSR     PerformZoom
  13929.   MOVEM.l (a7)+,a3-a6 ; Restore
  13930.   RTS
  13931. _MZoomShapeToBitmapCustom
  13932.   MOVEM.l a3-a6,-(a7) ; Store
  13933.   MOVE.l  d0,a5 ; a5=SrcX.q
  13934.   MOVE.l  d1,a6 ; a6=SrcY.q
  13935.   MOVE.w  CurrentChunkyBitmap1,d0 ; Dest bitmap
  13936.   !GetBitmapObjectPtr ; Base in a0
  13937.   MOVE.l  a0,a1 ; Dest
  13938.   MOVE.w  -8(a2),d0 ; Source shape
  13939.   !GetShapeObjectPtr; Base in a0 - source
  13940.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a3 ; Source data
  13941.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a4 ; Dest data
  13942.   BSR     PerformCustomZoom
  13943.   MOVEM.l (a7)+,a3-a6 ; Restore
  13944.   RTS
  13945.  
  13946. ;*************************************************************************************
  13947.  
  13948. ._MAddMode
  13949. ;Return value 7 to represent `Add' mode for blits
  13950.   MOVEQ.l #7,d0
  13951.   RTS
  13952.  
  13953. ;*************************************************************************************
  13954.  
  13955. .Subroutines
  13956.  
  13957. InitialiseRegs
  13958. ;Initialise registers for a graphic operation
  13959. ;OperationSource=Data, OperationDest=Stencil, same resource
  13960. ;Trashes d6
  13961. ;a0=Source struct
  13962. ;Returns d0=Width
  13963. ;Returns d1=Height
  13964. ;Returns a1=SourceAddress
  13965. ;Returns a2=DestAddress
  13966. ;Returns d7=LineModulo (LineMod+ClipLMod)
  13967.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; source
  13968.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a2 ; dest
  13969.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d7 ; modulo
  13970.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  13971.   BEQ     InitRegsNoClip
  13972.   MOVE.l  CRsrc_ClipBytes-ChunkyResources(a0),d6 ; Temp
  13973.   ADD.l   d6,a1 ; Point to clip topleft in data
  13974.   ADD.w   CRsrc_ClipLMod-ChunkyResources(a0),d7 ; TotalModulo
  13975.   ADD.l   d6,a2 ; Point to clip topleft in stencil
  13976.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d0 ; width
  13977.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d1 ; height
  13978.   BRA     InitRegsSkip
  13979. InitRegsNoClip
  13980.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d0 ; width
  13981.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d1 ; height
  13982. InitRegsSkip
  13983.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  13984.   BEQ     InitRegsNoWrap
  13985.   MOVE.l  CRsrc_WrapBytes-ChunkyResources(a0),d6 ; Temp
  13986.   ADD.l   d6,a1 ; Point to handle topleft in data
  13987.   ADD.l   d6,a2 ; Point to handle topleft in stencil
  13988. InitRegsNoWrap
  13989.   EXT.l   d7
  13990.   RTS
  13991.  
  13992. InitialiseRegs2
  13993. ;Initialise registers for a graphic operation
  13994. ;OperationSource&Dest=Data/Stencil preloaded in a1
  13995. ;Trashes d6
  13996. ;a0=Source struct
  13997. ;a1=Data/Stencil base-pointer
  13998. ;Returns d0=Width
  13999. ;Returns d1=Height
  14000. ;Returns a1=Address
  14001. ;Returns d7=LineModulo (LineMod+ClipLMod)
  14002.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d7 ; modulo
  14003.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  14004.   BEQ     InitRegs2NoClip
  14005.   MOVE.l  CRsrc_ClipBytes-ChunkyResources(a0),d6 ; Temp
  14006.   ADD.w   CRsrc_ClipLMod-ChunkyResources(a0),d7 ; TotalModulo
  14007.   ADD.l   d6,a1 ; Point to clip topleft in data
  14008.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d0 ; width
  14009.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d1 ; height
  14010.   BRA     InitRegs2Skip
  14011. InitRegs2NoClip
  14012.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d0 ; width
  14013.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d1 ; height
  14014. InitRegs2Skip
  14015.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wrap?
  14016.   BEQ     InitRegs2NoWrap
  14017.   MOVE.l  CRsrc_WrapBytes-ChunkyResources(a0),d6 ; Temp
  14018.   ADD.l   d6,a1 ; Point to handle topleft in data
  14019. InitRegs2NoWrap
  14020.   EXT.l   d7
  14021.   RTS
  14022.  
  14023. InitialiseRegs3
  14024. ;Initialise registers for a graphic operation (ignores clip) (assumes `safe' parameters)
  14025. ;OperationSource=Data/Stencil, OperationDest=Data/Stencil, different resources
  14026. ;a0=Source struct
  14027. ;a1=Dest struct
  14028. ;d2=X1 source
  14029. ;d3=Y1 source
  14030. ;d4=X2 dest
  14031. ;d5=Y2 dest
  14032. ;Returns a2=Source DataAddress
  14033. ;Returns a3=Dest DataAddress (make sure you preserve/restore)
  14034. ;Returns a4=Source StencilAddress (make sure you preserve/restore)
  14035. ;Returns a5=Dest StencilAddress (make sure you preserve/restore)
  14036. ;Returns d6=Source LineModulo (LineMod+ClipLMod)
  14037. ;Returns d7=Dest LineModulo (LineMod+ClipMod)
  14038. ;Trashes d0-d7/a2-a5
  14039.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a2 ; source data
  14040.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a4 ; source stencil
  14041.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a3 ; dest data
  14042.   MOVE.l  CRsrc_Stencil-ChunkyResources(a1),a5 ; dest stencil
  14043. InitialiseRegs3Entry ; Entry point for InitRegs4
  14044.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d6 ; source modulo
  14045.   MOVE.w  CRsrc_LineMod-ChunkyResources(a1),d7 ; dest modulo
  14046.   EXT.l   d6
  14047.   EXT.l   d7
  14048.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Source wrap?
  14049.   BEQ     InitRegs3NoSWrap
  14050.   MOVE.l  CRsrc_WrapBytes-ChunkyResources(a0),d0 ; Temp
  14051.   ADD.l   d0,a2 ; Point to handle topleft in source data
  14052.   ADD.l   d0,a4 ; Point to handle topleft in source stencil
  14053. InitRegs3NoSWrap
  14054.   TST.b   CRsrc_Wrapping-ChunkyResources(a1) ; Dest wrap?
  14055.   BEQ     InitRegs3NoDWrap
  14056.   MOVE.l  CRsrc_WrapBytes-ChunkyResources(a1),d0 ; Temp
  14057.   ADD.l   d0,a3 ; Point to handle topleft in dest data
  14058.   ADD.l   d0,a5 ; Point to handle topleft in dest stencil
  14059. InitRegs3NoDWrap
  14060.   MOVE.w  d6,d0 ; Temp
  14061.   ADD.w   CRsrc_Width-ChunkyResources(a0),d0
  14062.   MULU    d0,d3
  14063.   EXT.l   d2
  14064.   ADD.l   d2,d3 ; Source coordinate offset
  14065.   ADD.l   d3,a2 ; X1,Y1 in source data
  14066.   ADD.l   d3,a4 ; X1,Y1 in source stencil
  14067.   MOVE.w  d7,d0 ; Temp
  14068.   ADD.w   CRsrc_Width-ChunkyResources(a1),d0
  14069.   MULU    d0,d5
  14070.   EXT.l   d4
  14071.   ADD.l   d4,d5 ; Dest coordinate offset
  14072.   ADD.l   d5,a3 ; X2,Y2 in dest data
  14073.   ADD.l   d5,a5 ; X2,Y2 in dest stencil
  14074.   RTS
  14075.  
  14076. InitialiseRegs4
  14077. ;Initialise registers for a graphic operation (ignores clip) (assumes `safe' parameters)
  14078. ;OperationSource=Stencil, OperationDest=Stencil, different resources
  14079. ;a0=Source struct
  14080. ;a1=Dest struct
  14081. ;d2=X1 source
  14082. ;d3=Y1 source
  14083. ;d4=X2 dest
  14084. ;d5=Y2 dest
  14085. ;Returns a2=Source DataAddress
  14086. ;Returns a3=Dest DataAddress (make sure you preserve/restore)
  14087. ;Returns a4=Source StencilAddress (make sure you preserve/restore)
  14088. ;Returns a5=Dest StencilAddress (make sure you preserve/restore)
  14089. ;Returns d6=Source LineModulo (LineMod+ClipLMod)
  14090. ;Returns d7=Dest LineModulo (LineMod+ClipMod)
  14091. ;Trashes d0-d7/a2-a5
  14092.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a2 ; source data is stencil
  14093.   MOVE.l  a2,a4 ; source stencil
  14094.   MOVE.l  CRsrc_Stencil-ChunkyResources(a1),a3 ; dest data is stencil
  14095.   MOVE.l  a3,a5 ; dest stencil
  14096.   BRA     InitialiseRegs3Entry
  14097.   RTS;Wont be taken
  14098.  
  14099. InitialiseRegs5
  14100. ;Initialise registers for a graphic operation (ignores clip) (assumes `safe' parameters)
  14101. ;OperationSource=Data, OperationDest=Data, different resources no stencil
  14102. ;a0=Source struct
  14103. ;a1=Dest struct
  14104. ;d2=X1 source
  14105. ;d3=Y1 source
  14106. ;d4=X2 dest
  14107. ;d5=Y2 dest
  14108. ;Returns a2=Source DataAddress
  14109. ;Returns a3=Dest DataAddress (make sure you preserve/restore)
  14110. ;Returns d6=Source LineModulo (LineMod+ClipLMod)
  14111. ;Returns d7=Dest LineModulo (LineMod+ClipMod)
  14112. ;Trashes d0/d3/d5
  14113.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a2 ; source stencil
  14114.   MOVE.l  CRsrc_Data-ChunkyResources(a1),a3 ; dest stencil
  14115. InitialiseRegs5Entry ; Entrypoint from InitRegs5
  14116.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d6 ; source modulo
  14117.   MOVE.w  CRsrc_LineMod-ChunkyResources(a1),d7 ; dest modulo
  14118.   EXT.l   d6
  14119.   EXT.l   d7
  14120.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Source wrap?
  14121.   BEQ     InitRegs5NoSWrap
  14122.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a2 ; Point to handle topleft in source data
  14123. InitRegs5NoSWrap
  14124.   TST.b   CRsrc_Wrapping-ChunkyResources(a1) ; Dest wrap?
  14125.   BEQ     InitRegs5NoDWrap
  14126.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a3 ; Point to handle topleft in dest data
  14127. InitRegs5NoDWrap
  14128.   MOVE.w  d6,d0 ; Temp
  14129.   ADD.w   CRsrc_Width-ChunkyResources(a0),d0
  14130.   MULU.w  d0,d3
  14131.   EXT.l   d2
  14132.   ADD.l   d2,d3 ; Source coordinate offset
  14133.   ADD.l   d3,a2 ; X1,Y1 in source data
  14134.   MOVE.w  d7,d0 ; Temp
  14135.   ADD.w   CRsrc_Width-ChunkyResources(a1),d0
  14136.   MULU    d0,d5
  14137.   EXT.l   d4
  14138.   ADD.l   d4,d5 ; Dest coordinate offset
  14139.   ADD.l   d5,a3 ; X2,Y2 in dest data
  14140.   RTS
  14141.  
  14142. InitialiseRegs6
  14143. ;Initialise registers for a graphic operation (ignores clip) (assumes `safe' parameters)
  14144. ;OperationSource=Stencil, OperationDest=Stencil, different resources no stencil
  14145. ;a0=Source struct
  14146. ;a1=Dest struct
  14147. ;d2=X1 source
  14148. ;d3=Y1 source
  14149. ;d4=X2 dest
  14150. ;d5=Y2 dest
  14151. ;Returns a2=Source StencilAddress
  14152. ;Returns a3=Dest StencilAddress (make sure you preserve/restore)
  14153. ;Returns d6=Source LineModulo (LineMod+ClipLMod)
  14154. ;Returns d7=Dest LineModulo (LineMod+ClipMod)
  14155. ;Trashes d0/d3/d5
  14156.   MOVE.l  CRsrc_Stencil-ChunkyResources(a0),a2 ; source stencil
  14157.   MOVE.l  CRsrc_Stencil-ChunkyResources(a1),a3 ; dest stencil
  14158.   BRA     InitialiseRegs5Entry
  14159.   RTS;Wont be taken
  14160.  
  14161. PerformGenericBlit
  14162. ;Do a general blit, width should be multiple of 4
  14163. ;Copies data and stencil
  14164. ;d3=Operation width
  14165. ;d4=Operation height
  14166. ;d6=Source linemodulo
  14167. ;d7=Dest linemodulo
  14168. ;a2=Source data address
  14169. ;a3=Dest data address
  14170. ;a4=Source stencil address
  14171. ;a5=Dest stencil address
  14172. ;Trashes many
  14173.   MOVE.b  d3,d5 ; Copy width
  14174.   AND.b   #$0F,d5 ; Multiple of 16?
  14175.   BEQ     PerfGenBlit_16 ; yep
  14176.   LSR.w   #2,d3 ; Width/4 for longwords
  14177.   SUBQ.w  #1,d4 ; YLoopcounter
  14178.   SUBQ.w  #1,d3 ; XLoopcounter
  14179. PerfGenBlitYLoop
  14180.     MOVE.w  d3,d0 ; XLoop
  14181. PerfGenBlitXLoop
  14182.       MOVE.l  (a2)+,(a3)+ ; Copy data
  14183.       MOVE.l  (a4)+,(a5)+ ; Copy stencil
  14184.       DBRA  d0,PerfGenBlitXLoop
  14185.     ADD.w d6,a2 ; Source linemod to data
  14186.     ADD.w d6,a4 ; Source linemod to stencil
  14187.     ADD.w d7,a3 ; Dest linemod to data
  14188.     ADD.w d7,a5 ; Dest linemod to stencil
  14189.     DBRA  d4,PerfGenBlitYLoop
  14190.   RTS;pop
  14191. PerfGenBlit_16
  14192.   LSR.w   #4,d3 ; Width/16 for groups of 4 longwords
  14193.   SUBQ.w  #1,d4 ; YLoopcounter
  14194.   SUBQ.w  #1,d3 ; XLoopcounter
  14195. PerfGenBlit_16YLoop
  14196.     MOVE.w  d3,d0 ; XLoop
  14197. PerfGenBlit_16XLoop
  14198.       MOVE.l  (a2)+,(a3)+ ; Copy data
  14199.       MOVE.l  (a4)+,(a5)+ ; Copy stencil
  14200.       MOVE.l  (a2)+,(a3)+ ; Copy data
  14201.       MOVE.l  (a4)+,(a5)+ ; Copy stencil
  14202.       MOVE.l  (a2)+,(a3)+ ; Copy data
  14203.       MOVE.l  (a4)+,(a5)+ ; Copy stencil
  14204.       MOVE.l  (a2)+,(a3)+ ; Copy data
  14205.       MOVE.l  (a4)+,(a5)+ ; Copy stencil
  14206.       DBRA  d0,PerfGenBlit_16XLoop
  14207.     ADD.w d6,a2 ; Source linemod to data
  14208.     ADD.w d6,a4 ; Source linemod to stencil
  14209.     ADD.w d7,a3 ; Dest linemod to data
  14210.     ADD.w d7,a5 ; Dest linemod to stencil
  14211.     DBRA  d4,PerfGenBlit_16YLoop
  14212.   RTS
  14213.  
  14214. PerformGenericBlit2
  14215. ;Do a general blit, width does not have to be multiple
  14216. ;Copies data only
  14217. ;d3=Operation width
  14218. ;d4=Operation height
  14219. ;d6=Source linemodulo
  14220. ;d7=Dest linemodulo
  14221. ;a2=Source data address
  14222. ;a3=Dest data address
  14223. ;Trashes many
  14224.   MOVE.w  d3,d5 ; Copy Width
  14225.   AND.w   #$03,d5 ; Only extra bytes
  14226.   SUBQ.w  #1,d5 ; ByteLoop
  14227.   BLT     PerfGenBlit2Normal ; No extraneous bytes to check for
  14228.   LSR.w   #2,d3 ; Width/4 for longwords
  14229.   SUBQ.w  #1,d4 ; YLoopcounter
  14230.   SUBQ.w  #1,d3 ; XLoopcounter
  14231.   BLT     PerfGenBlit2NoLongwords
  14232. PerfGenBlit2YLoop
  14233.     MOVE.w  d3,d0 ; XLoop
  14234. PerfGenBlit2XLoop
  14235.       MOVE.l  (a2)+,(a3)+ ; Copy data
  14236.       DBRA  d0,PerfGenBlit2XLoop
  14237.     MOVE.w  d5,d0 ; XLoop
  14238. PerfGenBlit2XLoop2
  14239.       MOVE.b  (a2)+,(a3)+ ; Copy data
  14240.       DBRA    d0,PerfGenBlit2XLoop2
  14241.     ADD.w d6,a2 ; Source linemod to data
  14242.     ADD.w d7,a3 ; Dest linemod to data
  14243.     DBRA  d4,PerfGenBlit2YLoop
  14244.   RTS ; pop
  14245. PerfGenBlit2NoLongwords
  14246. PerfGenBlit2YLoop2
  14247.     MOVE.w  d5,d0 ; XLoop
  14248. PerfGenBlit2XLoop3
  14249.       MOVE.b  (a2)+,(a3)+ ; Copy data
  14250.       DBRA    d0,PerfGenBlit2XLoop3
  14251.     ADD.w d6,a2 ; Source linemod to data
  14252.     ADD.w d7,a3 ; Dest linemod to data
  14253.     DBRA  d4,PerfGenBlit2YLoop2
  14254.   RTS
  14255. PerfGenBlit2Normal
  14256.   MOVE.b  d3,d5 ; Copy width
  14257.   AND.b   #$0F,d5 ; Multiple of 16?
  14258.   BEQ     PerfGenBlit2Norm_16 ; yep
  14259.   LSR.w   #2,d3 ; Width/4 for longwords
  14260.   SUBQ.w  #1,d4 ; YLoopcounter
  14261.   SUBQ.w  #1,d3 ; XLoopcounter
  14262. PerfGenBlit2NormYLoop
  14263.     MOVE.w  d3,d0 ; XLoop
  14264. PerfGenBlit2NormXLoop
  14265.       MOVE.l  (a2)+,(a3)+ ; Copy data
  14266.       DBRA  d0,PerfGenBlit2NormXLoop
  14267.     ADD.w d6,a2 ; Source linemod to data
  14268.     ADD.w d7,a3 ; Dest linemod to data
  14269.     DBRA  d4,PerfGenBlit2NormYLoop
  14270.   RTS;pop
  14271. PerfGenBlit2Norm_16
  14272.   LSR.w   #4,d3 ; Width/16 for groups of 4 longwords
  14273.   SUBQ.w  #1,d4 ; YLoopcounter
  14274.   SUBQ.w  #1,d3 ; XLoopcounter
  14275. PerfGenBlit2Norm_16YLoop
  14276.     MOVE.w  d3,d0 ; XLoop
  14277. PerfGenBlit2Norm_16XLoop
  14278.       MOVE.l  (a2)+,(a3)+ ; Copy data
  14279.       MOVE.l  (a2)+,(a3)+ ; Copy data
  14280.       MOVE.l  (a2)+,(a3)+ ; Copy data
  14281.       MOVE.l  (a2)+,(a3)+ ; Copy data
  14282.       DBRA  d0,PerfGenBlit2Norm_16XLoop
  14283.     ADD.w d6,a2 ; Source linemod to data
  14284.     ADD.w d7,a3 ; Dest linemod to data
  14285.     DBRA  d4,PerfGenBlit2Norm_16YLoop
  14286.   RTS
  14287.  
  14288. PerformGenericBlit2b
  14289. ;Do a general blit, width does not have to be multiple
  14290. ;Copies data only
  14291. ;d3=Operation width
  14292. ;d4=Operation height
  14293. ;d6=Source linemodulo
  14294. ;d7=Dest linemodulo
  14295. ;a2=Source data address
  14296. ;a3=Dest data address
  14297. ;Trashes many
  14298.   MOVE.w  d3,d5 ; Copy Width
  14299.   AND.w   #$03,d5 ; Only extra bytes
  14300.   SUBQ.w  #1,d5 ; ByteLoop
  14301.   BLT     PerfGenBlit2bNormal
  14302.   MOVE.w  d3,d0 ; Get Width
  14303.   ADD.w   d6,d0 ; Add source linemod
  14304.   MULU    d4,d0 ; Total bytes
  14305.   SUB.l   d6,d0 ; -Linemod of last line
  14306.   ADD.l   d0,a2 ; Add to source address
  14307.   MOVE.w  d3,d0 ; Get Width
  14308.   ADD.w   d7,d0 ; Add dest linemod
  14309.   MULU    d4,d0 ; Total bytes
  14310.   SUB.l   d7,d0 ; -Linemod of last line
  14311.   ADD.l   d0,a3 ; Add to dest address
  14312.   LSR.w   #2,d3 ; Width/4 for longwords
  14313.   SUBQ.w  #1,d4 ; YLoopcounter
  14314.   SUBQ.w  #1,d3 ; XLoopcounter
  14315.   BLT     PerfGenBlit2bNoLongwords
  14316. PerfGenBlit2bYLoop
  14317.     MOVE.w  d3,d0 ; XLoop
  14318. PerfGenBlit2bXLoop
  14319.       MOVE.l  -(a2),-(a3) ; Copy data
  14320.       DBRA  d0,PerfGenBlit2bXLoop
  14321.     MOVE.w  d5,d0 ; XLoop
  14322. PerfGenBlit2bXLoop2
  14323.       MOVE.b  -(a2),-(a3) ; Copy data
  14324.       DBRA    d0,PerfGenBlit2bXLoop2
  14325.     SUB.w d6,a2 ; Source linemod to data
  14326.     SUB.w d7,a3 ; Dest linemod to data
  14327.     DBRA  d4,PerfGenBlit2bYLoop
  14328.   RTS ; pop
  14329. PerfGenBlit2bNoLongwords
  14330. PerfGenBlit2bYLoop2
  14331.     MOVE.w  d5,d0 ; XLoop
  14332. PerfGenBlit2bXLoop3
  14333.       MOVE.b  -(a2),-(a3) ; Copy data
  14334.       DBRA    d0,PerfGenBlit2bXLoop3
  14335.     SUB.w d6,a2 ; Source linemod to data
  14336.     SUB.w d7,a3 ; Dest linemod to data
  14337.     DBRA  d4,PerfGenBlit2bYLoop2
  14338.   RTS
  14339. PerfGenBlit2bNormal
  14340.   MOVE.b  d3,d5 ; Copy width
  14341.   AND.b   #$0F,d5 ; Multiple of 16?
  14342.   BEQ     PerfGenBlit2bNorm_16 ; yep
  14343.   MOVE.w  d3,d0 ; Get Width
  14344.   ADD.w   d6,d0 ; Add source linemod
  14345.   MULU    d4,d0 ; Total bytes
  14346.   SUB.l   d6,d0 ; -Linemod of last line
  14347.   ADD.l   d0,a2 ; Add to source address
  14348.   MOVE.w  d3,d0 ; Get Width
  14349.   ADD.w   d7,d0 ; Add dest linemod
  14350.   MULU    d4,d0 ; Total bytes
  14351.   SUB.l   d7,d0 ; -Linemod of last line
  14352.   ADD.l   d0,a3 ; Add to dest address
  14353.   LSR.w   #2,d3 ; Width/4 for longwords
  14354.   SUBQ.w  #1,d4 ; YLoopcounter
  14355.   SUBQ.w  #1,d3 ; XLoopcounter
  14356. PerfGenBlit2bNormYLoop
  14357.     MOVE.w  d3,d0 ; XLoop
  14358. PerfGenBlit2bNormXLoop
  14359.       MOVE.l  -(a2),-(a3) ; Copy data
  14360.       DBRA  d0,PerfGenBlit2bNormXLoop
  14361.     SUB.w d6,a2 ; Source linemod to data
  14362.     SUB.w d7,a3 ; Dest linemod to data
  14363.     DBRA  d4,PerfGenBlit2bNormYLoop
  14364.   RTS;pop
  14365. PerfGenBlit2bNorm_16
  14366.   MOVE.w  d3,d0 ; Get Width
  14367.   ADD.w   d6,d0 ; Add source linemod
  14368.   MULU    d4,d0 ; Total bytes
  14369.   SUB.l   d6,d0 ; -Linemod of last line
  14370.   ADD.l   d0,a2 ; Add to source address
  14371.   MOVE.w  d3,d0 ; Get Width
  14372.   ADD.w   d7,d0 ; Add dest linemod
  14373.   MULU    d4,d0 ; Total bytes
  14374.   SUB.l   d7,d0 ; -Linemod of last line
  14375.   ADD.l   d0,a3 ; Add to dest address
  14376.   LSR.w   #4,d3 ; Width/16 for groups of 4 longwords
  14377.   SUBQ.w  #1,d4 ; YLoopcounter
  14378.   SUBQ.w  #1,d3 ; XLoopcounter
  14379. PerfGenBlit2bNorm_16YLoop
  14380.     MOVE.w  d3,d0 ; XLoop
  14381. PerfGenBlit2bNorm_16XLoop
  14382.       MOVE.l  -(a2),-(a3) ; Copy data
  14383.       MOVE.l  -(a2),-(a3) ; Copy data
  14384.       MOVE.l  -(a2),-(a3) ; Copy data
  14385.       MOVE.l  -(a2),-(a3) ; Copy data
  14386.       DBRA  d0,PerfGenBlit2bNorm_16XLoop
  14387.     SUB.w d6,a2 ; Source linemod to data
  14388.     SUB.w d7,a3 ; Dest linemod to data
  14389.     DBRA  d4,PerfGenBlit2bNorm_16YLoop
  14390.   RTS
  14391.  
  14392. PerformGenericBlit2Custom
  14393. ;Do a general blit, width does not have to be multiple
  14394. ;Copies data only, offsets each line using OffsetList
  14395. ;d3=Operation width (on which initial modulos are based)
  14396. ;d4=Operation height
  14397. ;d6=Source linemodulo
  14398. ;d7=Dest linemodulo
  14399. ;a2=Source data address
  14400. ;a3=Dest data address
  14401. ;Trashes many
  14402.   MOVE.l  LongwordStore,a6 ; Get OffsetList.l
  14403.   SUBQ.w  #1,d4 ; YLoopcounter
  14404.   MOVE.w  d3,a4 ; Store specified width
  14405. PerfGenBlit2CustomYLoop
  14406.     MOVE.w  (a6)+,d3 ; Absolute width of line
  14407.     MOVE.w  a4,d1 ; Get specified width
  14408.     MOVE.w  d3,d5 ; Copy Width
  14409.     SUB.w   d3,d1 ; Extra linemodulo to handle width change
  14410.     AND.w   #$03,d5 ; Only extra bytes
  14411.     ADD.w   (a6)+,a2 ; Source X1 offset, relative to previous line
  14412.     SUBQ.w  #1,d5 ; ByteLoop
  14413.     LSR.w   #2,d3 ; Width/4 for longwords
  14414.     ADD.w   (a6)+,a3 ; Dest X2 offset, relative to previous line
  14415.     SUBQ.w  #1,d3 ; XLoopcounter
  14416.     BLT     PerfGenBlit2CustomNoLongwords
  14417. PerfGenBlit2CustomXLoop
  14418.       MOVE.l  (a2)+,(a3)+ ; Copy data
  14419.       DBRA  d3,PerfGenBlit2CustomXLoop
  14420. PerfGenBlit2CustomNoLongwords
  14421.     TST.w   d5 ; bytes?
  14422.     BLT     PerfGenBlit2CustomNoBytes
  14423. PerfGenBlit2CustomXLoop2
  14424.         MOVE.b  (a2)+,(a3)+ ; Copy data
  14425.         DBRA    d5,PerfGenBlit2CustomXLoop2
  14426. PerfGenBlit2CustomNoBytes
  14427.     ADD.w d1,a2 ; Extra linemod caused by width change
  14428.     ADD.w d1,a3 ; Extra linemod caused by width change
  14429.     ADD.w (a6)+,a2 ; Absolute extra source linemodulo
  14430.     ADD.w d7,a3 ; Dest linemod to data
  14431.     ADD.w d6,a2 ; Source linemod to data
  14432.     DBRA  d4,PerfGenBlit2CustomYLoop
  14433.   RTS ; pop
  14434.  
  14435. PerformGenericBlit2bCustom
  14436. ;Do a general blit, width does not have to be multiple
  14437. ;Copies data only, offsets each line using OffsetList, as GenBlit2Custom but backwards
  14438. ;d3=Operation width (on which initial modulos are based)
  14439. ;d4=Operation height
  14440. ;d6=Source linemodulo
  14441. ;d7=Dest linemodulo
  14442. ;a2=Source data address
  14443. ;a3=Dest data address
  14444. ;Trashes many
  14445.   MOVE.l  LongwordStore,a6 ; Get OffsetList.l
  14446.   MOVE.w  d3,d0 ; Get Width
  14447.   ADD.w   d6,d0 ; Add source linemod
  14448.   MULU    d4,d0 ; Total bytes
  14449.   SUB.l   d6,d0 ; -Linemod of last line
  14450.   ADD.l   d0,a2 ; Add to source address
  14451.   MOVE.w  d3,d0 ; Get Width
  14452.   ADD.w   d7,d0 ; Add dest linemod
  14453.   MULU    d4,d0 ; Total bytes
  14454.   SUB.l   d7,d0 ; -Linemod of last line
  14455.   ADD.l   d0,a3 ; Add to dest address
  14456.   SUBQ.w  #1,d4 ; YLoopcounter
  14457.   MOVE.w  d3,a4 ; Store specified width
  14458. PerfGenBlit2bCustomYLoop
  14459.     MOVE.w  (a6)+,d3 ; Absolute width of line
  14460.     MOVE.w  a4,d1 ; Get specified width
  14461.     MOVE.w  d3,d5 ; Copy Width
  14462.     SUB.w   d3,d1 ; Extra linemodulo to handle width change
  14463.     AND.w   #$03,d5 ; Only extra bytes
  14464.     ADD.w   (a6)+,a2 ; Source X1 offset, relative to previous line
  14465.     SUBQ.w  #1,d5 ; ByteLoop
  14466.     LSR.w   #2,d3 ; Width/4 for longwords
  14467.     ADD.w   (a6)+,a3 ; Dest X2 offset, relative to previous line
  14468.     SUBQ.w  #1,d3 ; XLoopcounter
  14469.     BLT     PerfGenBlit2bCustomNoLongwords
  14470. PerfGenBlit2bCustomXLoop
  14471.       MOVE.l  -(a2),-(a3) ; Copy data
  14472.       DBRA  d3,PerfGenBlit2bCustomXLoop
  14473. PerfGenBlit2bCustomNoLongwords
  14474.     TST.w   d5 ; bytes?
  14475.     BLT     PerfGenBlit2bCustomNoBytes
  14476. PerfGenBlit2bCustomXLoop2
  14477.         MOVE.b  -(a2),-(a3) ; Copy data
  14478.         DBRA    d5,PerfGenBlit2bCustomXLoop2
  14479. PerfGenBlit2bCustomNoBytes
  14480.     SUB.w d1,a2 ; Extra linemod caused by width change
  14481.     SUB.w d1,a3 ; Extra linemod caused by width change
  14482.     ADD.w (a6)+,a2 ; Absolute extra source linemodulo
  14483.     SUB.w d7,a3 ; Dest linemod to data
  14484.     SUB.w d6,a2 ; Source linemod to data
  14485.     DBRA  d4,PerfGenBlit2bCustomYLoop
  14486.   RTS ; pop
  14487.  
  14488. PerformGenericBlit3
  14489. ;Do a general stencilled-blit, width should be multiple of 4
  14490. ;Copies data using stencil for cookie-cut
  14491. ;d3=Operation width
  14492. ;d4=Operation height
  14493. ;d6=Source linemodulo
  14494. ;d7=Dest linemodulo
  14495. ;a2=Source data address
  14496. ;a3=Dest data address
  14497. ;a4=Source stencil address
  14498. ;Trashes many
  14499.   MOVE.w  SScrollModeType,d0
  14500.   BRA     PerformBlit1
  14501.   RTS     ; Precaution
  14502.  
  14503. PerformGenericBlit3b ; Same as GenericBlit3 but in reverse
  14504. ;Do a general stencilled-blit, width should be multiple of 4
  14505. ;Copies data using stencil for cookie-cut
  14506. ;d3=Operation width
  14507. ;d4=Operation height
  14508. ;d6=Source linemodulo
  14509. ;d7=Dest linemodulo
  14510. ;a2=Source data address
  14511. ;a3=Dest data address
  14512. ;a4=Source stencil address
  14513. ;Trashes many
  14514.   MOVE.w  SScrollModeType,d0
  14515.   BRA     PerformBlit1b
  14516.   RTS     ; Precaution
  14517.  
  14518. PerformGenericBlit4
  14519. ;Do a general block-blit, width should be multiple of 16 and lie on 16-byte aligned addresses
  14520. ;Copies data only
  14521. ;d3=Operation width
  14522. ;d4=Operation height
  14523. ;d6=Source linemodulo
  14524. ;d7=Dest linemodulo
  14525. ;a2=Source data address
  14526. ;a3=Dest data address
  14527. ;Trashes many
  14528.   MOVE.w  d3,d5 ; Copy width
  14529.   AND.b   #$3F,d5 ; Multiple of 64?
  14530.   BEQ     PerfGenBlit4_64
  14531.   LSR.w   #4,d3 ; Width/16 for groups of 4 longwords (16 bytes)
  14532.   SUBQ.w  #1,d3 ; XLoopcounter
  14533.   SUBQ.w  #1,d4 ; YLoopcounter
  14534.   TST.b   GeneralCPUmode
  14535.   BEQ     PerfGenBlit4_030
  14536. PerfGenBlit4_040
  14537. PerfGenBlit4_040YLoop
  14538.     MOVE.w  d3,d0 ; XLoop
  14539. PerfGenBlit4_040XLoop
  14540.       Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  14541.       DBRA  d0,PerfGenBlit4_040XLoop
  14542.     ADD.w d6,a2 ; Source linemod to data
  14543.     ADD.w d7,a3 ; Dest linemod to data
  14544.     DBRA  d4,PerfGenBlit4_040YLoop
  14545.   RTS;pop
  14546. PerfGenBlit4_030
  14547. PerfGenBlit4_030YLoop
  14548.     MOVE.w  d3,d0 ; XLoop
  14549. PerfGenBlit4_030XLoop
  14550.       MOVE.l  (a2)+,(a3)+
  14551.       MOVE.l  (a2)+,(a3)+
  14552.       MOVE.l  (a2)+,(a3)+
  14553.       MOVE.l  (a2)+,(a3)+
  14554.       DBRA  d0,PerfGenBlit4_030XLoop
  14555.     ADD.w d6,a2 ; Source linemod to data
  14556.     ADD.w d7,a3 ; Dest linemod to data
  14557.     DBRA  d4,PerfGenBlit4_030YLoop
  14558.   RTS
  14559. PerfGenBlit4_64
  14560.   LSR.w   #6,d3 ; Width/64 for groups of 16 longwords (64 bytes)
  14561.   SUBQ.w  #1,d3 ; XLoopcounter
  14562.   SUBQ.w  #1,d4 ; YLoopcounter
  14563.   TST.b   GeneralCPUmode
  14564.   BEQ     PerfGenBlit4_64_030
  14565. PerfGenBlit4_64_040
  14566. PerfGenBlit4_64_040YLoop
  14567.     MOVE.w  d3,d0 ; XLoop
  14568. PerfGenBlit4_64_040XLoop
  14569.       Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  14570.       Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  14571.       Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  14572.       Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+ ; Copy 64 bytes
  14573.       DBRA  d0,PerfGenBlit4_64_040XLoop
  14574.     ADD.w d6,a2 ; Source linemod to data
  14575.     ADD.w d7,a3 ; Dest linemod to data
  14576.     DBRA  d4,PerfGenBlit4_64_040YLoop
  14577.   RTS;pop
  14578. PerfGenBlit4_64_030
  14579. PerfGenBlit4_64_030YLoop
  14580.     MOVE.w  d3,d0 ; XLoop
  14581. PerfGenBlit4_64_030XLoop
  14582.       MOVE.l  (a2)+,(a3)+
  14583.       MOVE.l  (a2)+,(a3)+
  14584.       MOVE.l  (a2)+,(a3)+
  14585.       MOVE.l  (a2)+,(a3)+
  14586.       MOVE.l  (a2)+,(a3)+
  14587.       MOVE.l  (a2)+,(a3)+
  14588.       MOVE.l  (a2)+,(a3)+
  14589.       MOVE.l  (a2)+,(a3)+
  14590.       MOVE.l  (a2)+,(a3)+
  14591.       MOVE.l  (a2)+,(a3)+
  14592.       MOVE.l  (a2)+,(a3)+
  14593.       MOVE.l  (a2)+,(a3)+
  14594.       MOVE.l  (a2)+,(a3)+
  14595.       MOVE.l  (a2)+,(a3)+
  14596.       MOVE.l  (a2)+,(a3)+
  14597.       MOVE.l  (a2)+,(a3)+ ; Copy 64 bytes
  14598.       DBRA  d0,PerfGenBlit4_64_030XLoop
  14599.     ADD.w d6,a2 ; Source linemod to data
  14600.     ADD.w d7,a3 ; Dest linemod to data
  14601.     DBRA  d4,PerfGenBlit4_64_030YLoop
  14602.   RTS
  14603.  
  14604. PerformGenericBlit4b ; As GenericBlit2 but in reverse
  14605. ;Do a general block-blit, width should be multiple of 16 and lie on 16-byte aligned addresses
  14606. ;Copies data only
  14607. ;d3=Operation width
  14608. ;d4=Operation height
  14609. ;d6=Source linemodulo
  14610. ;d7=Dest linemodulo
  14611. ;a2=Source data address
  14612. ;a3=Dest data address
  14613. ;Trashes many
  14614.   MOVE.w  d3,d5 ; Copy width
  14615.   AND.b   #$3F,d5 ; Multilpe of 64?
  14616.   BEQ     PerfGenBlit4b_64
  14617.   MOVE.w  d3,d0 ; Get Width
  14618.   ADD.w   d6,d0 ; Add source linemod
  14619.   MULU    d4,d0 ; Total bytes
  14620.   SUB.l   d6,d0 ; -Linemod of last line
  14621.   ADD.l   d0,a2 ; Add to source address
  14622.   MOVE.w  d3,d0 ; Get Width
  14623.   ADD.w   d7,d0 ; Add dest linemod
  14624.   MULU    d4,d0 ; Total bytes
  14625.   SUB.l   d7,d0 ; -Linemod of last line
  14626.   ADD.l   d0,a3 ; Add to dest address
  14627.   LSR.w   #4,d3 ; Width/16 for groups of 4 longwords (16 bytes)
  14628.   SUBQ.w  #1,d3 ; XLoopcounter
  14629.   SUBQ.w  #1,d4 ; YLoopcounter
  14630.   TST.b   GeneralCPUmode
  14631.   BEQ     PerfGenBlit4b_030
  14632. PerfGenBlit4b_040
  14633.   SUB.w   #16,a2 ; Prepare first move16
  14634.   SUB.w   #16,a3 ; Prepare first move16
  14635.   MOVEQ.l #16*2,d1 ; Init temp
  14636. PerfGenBlit4b_040YLoop
  14637.     MOVE.w  d3,d0 ; XLoop
  14638. PerfGenBlit4b_040XLoop
  14639.       Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  14640.       SUB.w d1,a2 ; Backpeddle
  14641.       SUB.w d1,a3 ; Backpeddle
  14642.       DBRA  d0,PerfGenBlit4b_040XLoop
  14643.     SUB.w d6,a2 ; Source linemod from data
  14644.     SUB.w d7,a3 ; Dest linemod from data
  14645.     DBRA  d4,PerfGenBlit4b_040YLoop
  14646.   RTS;pop
  14647. PerfGenBlit4b_030
  14648. PerfGenBlit4b_030YLoop
  14649.     MOVE.w  d3,d0 ; XLoop
  14650. PerfGenBlit4b_030XLoop
  14651.       MOVE.l  -(a2),-(a3) ; Copy 4 bytes
  14652.       MOVE.l  -(a2),-(a3) ; Copy 8 bytes
  14653.       MOVE.l  -(a2),-(a3) ; Copy 12 bytes
  14654.       MOVE.l  -(a2),-(a3) ; Copy 16 bytes
  14655.       DBRA  d0,PerfGenBlit4b_030XLoop
  14656.     SUB.w d6,a2 ; Source linemod from data
  14657.     SUB.w d7,a3 ; Dest linemod from data
  14658.     DBRA  d4,PerfGenBlit4b_030YLoop
  14659.   RTS
  14660. PerfGenBlit4b_64
  14661.   MOVE.w  d3,d0 ; Get Width
  14662.   ADD.w   d6,d0 ; Add source linemod
  14663.   MULU    d4,d0 ; Total bytes
  14664.   SUB.l   d6,d0 ; -Linemod of last line
  14665.   ADD.l   d0,a2 ; Add to source address
  14666.   MOVE.w  d3,d0 ; Get Width
  14667.   ADD.w   d7,d0 ; Add dest linemod
  14668.   MULU    d4,d0 ; Total bytes
  14669.   SUB.l   d7,d0 ; -Linemod of last line
  14670.   ADD.l   d0,a3 ; Add to dest address
  14671.   LSR.w   #6,d3 ; Width/64 for groups of 16 longwords (64 bytes)
  14672.   SUBQ.w  #1,d3 ; XLoopcounter
  14673.   SUBQ.w  #1,d4 ; YLoopcounter
  14674.   TST.b   GeneralCPUmode
  14675.   BEQ     PerfGenBlit4b_64_030
  14676. PerfGenBlit4b_64_040
  14677.   SUB.w   #64,a2 ; Prepare first group of move16's
  14678.   SUB.w   #64,a3 ; Prepare first group of move16's
  14679.   MOVE.l  #64*2,d1 ; Init temp
  14680. PerfGenBlit4b_64_040YLoop
  14681.     MOVE.w  d3,d0 ; XLoop
  14682. PerfGenBlit4b_64_040XLoop
  14683.       Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  14684.       Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  14685.       Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  14686.       Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+ ; 64 bytes
  14687.       SUB.w d1,a2 ; Backpeddle
  14688.       SUB.w d1,a3 ; Backpeddle
  14689.       DBRA  d0,PerfGenBlit4b_64_040XLoop
  14690.     SUB.w d6,a2 ; Source linemod from data
  14691.     SUB.w d7,a3 ; Dest linemod from data
  14692.     DBRA  d4,PerfGenBlit4b_64_040YLoop
  14693.   RTS;pop
  14694. PerfGenBlit4b_64_030
  14695. PerfGenBlit4b_64_030YLoop
  14696.     MOVE.w  d3,d0 ; XLoop
  14697. PerfGenBlit4b_64_030XLoop
  14698.       MOVE.l  -(a2),-(a3) ; 4 bytes
  14699.       MOVE.l  -(a2),-(a3) ; 8 bytes
  14700.       MOVE.l  -(a2),-(a3) ; 12 bytes
  14701.       MOVE.l  -(a2),-(a3) ; 16 bytes
  14702.       MOVE.l  -(a2),-(a3) ; 20 bytes
  14703.       MOVE.l  -(a2),-(a3) ; 24 bytes
  14704.       MOVE.l  -(a2),-(a3) ; 28 bytes
  14705.       MOVE.l  -(a2),-(a3) ; 32 bytes
  14706.       MOVE.l  -(a2),-(a3) ; 36 bytes
  14707.       MOVE.l  -(a2),-(a3) ; 40 bytes
  14708.       MOVE.l  -(a2),-(a3) ; 44 bytes
  14709.       MOVE.l  -(a2),-(a3) ; 48 bytes
  14710.       MOVE.l  -(a2),-(a3) ; 52 bytes
  14711.       MOVE.l  -(a2),-(a3) ; 56 bytes
  14712.       MOVE.l  -(a2),-(a3) ; 60 bytes
  14713.       MOVE.l  -(a2),-(a3) ; 64 bytes
  14714.       DBRA  d0,PerfGenBlit4b_64_030XLoop
  14715.     SUB.w d6,a2 ; Source linemod from data
  14716.     SUB.w d7,a3 ; Dest linemod from data
  14717.     DBRA  d4,PerfGenBlit4b_64_030YLoop
  14718.   RTS
  14719.  
  14720. PerformGenericBlit5
  14721. ;Do a general blit, width doesn't need to be multiple
  14722. ;Copies data solid and copies stencil/cookie to dest stencil/cookie
  14723. ;d3=Operation width
  14724. ;d4=Operation height
  14725. ;d6=Source linemodulo
  14726. ;d7=Dest linemodulo
  14727. ;a2=Source data address
  14728. ;a3=Dest data address
  14729. ;a4=Source stencil address
  14730. ;a5=Dest stencil address
  14731. ;Trashes many
  14732.   MOVE.w  d3,d5 ; Copy Width
  14733.   AND.w   #$03,d5 ; Only extra bytes
  14734.   SUBQ.w  #1,d5 ; ByteLoop
  14735.   BLT     PerfGenBlit5Normal ; No need to check for extraneous bytes
  14736.   LSR.w   #2,d3 ; Width/4 for longwords
  14737.   SUBQ.w  #1,d4 ; YLoopcounter
  14738.   SUBQ.w  #1,d3 ; XLoopcounter
  14739.   BLT     PerfGenBlit5NoLongwords
  14740. PerfGenBlit5YLoop
  14741.     MOVE.w  d3,d0 ; XLoop
  14742. PerfGenBlit5XLoop
  14743.       MOVE.l  (a2)+,(a3)+ ; Copy data
  14744.       MOVE.l  (a4)+,(a5)+ ; Copy stencil
  14745.       DBRA    d0,PerfGenBlit5XLoop
  14746.     MOVE.w  d5,d0 ; XLoop
  14747. PerfGenBlit5XLoop2
  14748.       MOVE.b  (a2)+,(a3)+ ; Copy data
  14749.       MOVE.b  (a4)+,(a5)+ ; Copy stencil
  14750.       DBRA    d0,PerfGenBlit5XLoop2
  14751.     ADD.w d6,a2 ; Source linemod to data
  14752.     ADD.w d6,a4 ; Source linemod to stencil
  14753.     ADD.w d7,a3 ; Dest linemod to data
  14754.     ADD.w d7,a5 ; Dest linemod to stencil
  14755.     DBRA  d4,PerfGenBlit5YLoop
  14756.   RTS ; pop
  14757. PerfGenBlit5NoLongwords
  14758. PerfGenBlit5YLoop2
  14759.     MOVE.w  d5,d0 ; XLoop
  14760. PerfGenBlit5XLoop3
  14761.       MOVE.b  (a2)+,(a3)+ ; Copy data
  14762.       MOVE.b  (a4)+,(a5)+ ; Copy stencil
  14763.       DBRA    d0,PerfGenBlit5XLoop3
  14764.     ADD.w d6,a2 ; Source linemod to data
  14765.     ADD.w d6,a4 ; Source linemod to stencil
  14766.     ADD.w d7,a3 ; Dest linemod to data
  14767.     ADD.w d7,a5 ; Dest linemod to stencil
  14768.     DBRA  d4,PerfGenBlit5YLoop2
  14769.   RTS
  14770. PerfGenBlit5Normal
  14771.   MOVE.b  d3,d5 ; Copy width
  14772.   AND.b   #$0F,d5 ; Multiple of 16?
  14773.   BEQ     PerfGenBlit5Norm_16 ; yep
  14774.   LSR.w   #2,d3 ; Width/4 for longwords
  14775.   SUBQ.w  #1,d4 ; YLoopcounter
  14776.   SUBQ.w  #1,d3 ; XLoopcounter
  14777. PerfGenBlit5NormYLoop
  14778.     MOVE.w  d3,d0 ; XLoop
  14779. PerfGenBlit5NormXLoop
  14780.       MOVE.l  (a2)+,(a3)+ ; Copy data
  14781.       MOVE.l  (a4)+,(a5)+ ; Copy stencil
  14782.       DBRA  d0,PerfGenBlit5NormXLoop
  14783.     ADD.w d6,a2 ; Source linemod to data
  14784.     ADD.w d6,a4 ; Source linemod to stencil
  14785.     ADD.w d7,a3 ; Dest linemod to data
  14786.     ADD.w d7,a5 ; Dest linemod to stencil
  14787.     DBRA  d4,PerfGenBlit5NormYLoop
  14788.   RTS;pop
  14789. PerfGenBlit5Norm_16
  14790.   LSR.w   #4,d3 ; Width/16 for groups of 4 longwords
  14791.   SUBQ.w  #1,d4 ; YLoopcounter
  14792.   SUBQ.w  #1,d3 ; XLoopcounter
  14793. PerfGenBlit5Norm_16YLoop
  14794.     MOVE.w  d3,d0 ; XLoop
  14795. PerfGenBlit5Norm_16XLoop
  14796.       MOVE.l  (a2)+,(a3)+ ; Copy data
  14797.       MOVE.l  (a4)+,(a5)+ ; Copy stencil
  14798.       MOVE.l  (a2)+,(a3)+ ; Copy data
  14799.       MOVE.l  (a4)+,(a5)+ ; Copy stencil
  14800.       MOVE.l  (a2)+,(a3)+ ; Copy data
  14801.       MOVE.l  (a4)+,(a5)+ ; Copy stencil
  14802.       MOVE.l  (a2)+,(a3)+ ; Copy data
  14803.       MOVE.l  (a4)+,(a5)+ ; Copy stencil
  14804.       DBRA  d0,PerfGenBlit5Norm_16XLoop
  14805.     ADD.w d6,a2 ; Source linemod to data
  14806.     ADD.w d6,a4 ; Source linemod to stencil
  14807.     ADD.w d7,a3 ; Dest linemod to data
  14808.     ADD.w d7,a5 ; Dest linemod to stencil
  14809.     DBRA  d4,PerfGenBlit5Norm_16YLoop
  14810.   RTS
  14811.  
  14812. PerformGenericBlit5b ; Same as GenericBlit5 but in reverse
  14813. ;Do a general blit, width doesn't need to be multiple
  14814. ;Copies data solid and copies stencil/cookie to dest stencil/cookie
  14815. ;d3=Operation width
  14816. ;d4=Operation height
  14817. ;d6=Source linemodulo
  14818. ;d7=Dest linemodulo
  14819. ;a2=Source data address
  14820. ;a3=Dest data address
  14821. ;a4=Source stencil address
  14822. ;a5=Dest stencil address
  14823. ;Trashes many
  14824.   MOVE.w  d3,d5 ; Copy Width
  14825.   AND.w   #$03,d5 ; Only extra bytes
  14826.   SUBQ.w  #1,d5 ; ByteLoop
  14827.   BLT     PerfGenBlit5bNormal ; No need to check for extraneous bytes
  14828.   MOVE.w  d3,d0 ; Get Width
  14829.   ADD.w   d6,d0 ; Add source linemod
  14830.   MULU    d4,d0 ; Total bytes
  14831.   SUB.l   d6,d0 ; -Linemod of last line
  14832.   ADD.l   d0,a2 ; Add to source address
  14833.   ADD.l   d0,a4 ; Add to source stencil address
  14834.   MOVE.w  d3,d0 ; Get Width
  14835.   ADD.w   d7,d0 ; Add dest linemod
  14836.   MULU    d4,d0 ; Total bytes
  14837.   SUB.l   d7,d0 ; -Linemod of last line
  14838.   ADD.l   d0,a3 ; Add to dest address
  14839.   ADD.l   d0,a5 ; Add to dest stencil address
  14840.   LSR.w   #2,d3 ; Width/4 for longwords
  14841.   SUBQ.w  #1,d4 ; YLoopcounter
  14842.   SUBQ.w  #1,d3 ; XLoopcounter
  14843.   BLT     PerfGenBlit5bNoLongwords
  14844. PerfGenBlit5bYLoop
  14845.     MOVE.w  d3,d0 ; XLoop
  14846. PerfGenBlit5bXLoop
  14847.       MOVE.l  -(a2),-(a3) ; Copy data
  14848.       MOVE.l  -(a4),-(a5) ; Copy stencil
  14849.       DBRA    d0,PerfGenBlit5bXLoop
  14850.     MOVE.w  d5,d0 ; XLoop
  14851. PerfGenBlit5bXLoop2
  14852.       MOVE.b  -(a2),-(a3) ; Copy data
  14853.       MOVE.b  -(a4),-(a5) ; Copy stencil
  14854.       DBRA    d0,PerfGenBlit5bXLoop2
  14855.     SUB.w d6,a2 ; Source linemod to data
  14856.     SUB.w d6,a4 ; Source linemod to stencil
  14857.     SUB.w d7,a3 ; Dest linemod to data
  14858.     SUB.w d7,a5 ; Dest linemod to stencil
  14859.     DBRA  d4,PerfGenBlit5bYLoop
  14860.   RTS ; pop
  14861. PerfGenBlit5bNoLongwords
  14862. PerfGenBlit5bYLoop2
  14863.     MOVE.w  d5,d0 ; XLoop
  14864. PerfGenBlit5bXLoop3
  14865.       MOVE.b  -(a2),-(a3) ; Copy data
  14866.       MOVE.b  -(a4),-(a5) ; Copy stencil
  14867.       DBRA    d0,PerfGenBlit5bXLoop3
  14868.     SUB.w d6,a2 ; Source linemod to data
  14869.     SUB.w d6,a4 ; Source linemod to stencil
  14870.     SUB.w d7,a3 ; Dest linemod to data
  14871.     SUB.w d7,a5 ; Dest linemod to stencil
  14872.     DBRA  d4,PerfGenBlit5bYLoop2
  14873.   RTS
  14874. PerfGenBlit5bNormal
  14875.   MOVE.b  d3,d5 ; Copy width
  14876.   AND.b   #$0F,d5 ; Multiple of 16?
  14877.   BEQ     PerfGenBlit5bNorm_16 ; yep
  14878.   MOVE.w  d3,d0 ; Get Width
  14879.   ADD.w   d6,d0 ; Add source linemod
  14880.   MULU    d4,d0 ; Total bytes
  14881.   SUB.l   d6,d0 ; -Linemod of last line
  14882.   ADD.l   d0,a2 ; Add to source address
  14883.   MOVE.w  d3,d0 ; Get Width
  14884.   ADD.w   d7,d0 ; Add dest linemod
  14885.   MULU    d4,d0 ; Total bytes
  14886.   SUB.l   d7,d0 ; -Linemod of last line
  14887.   ADD.l   d0,a3 ; Add to dest address
  14888.   LSR.w   #2,d3 ; Width/4 for longwords
  14889.   SUBQ.w  #1,d4 ; YLoopcounter
  14890.   SUBQ.w  #1,d3 ; XLoopcounter
  14891. PerfGenBlit5bNormYLoop
  14892.     MOVE.w  d3,d0 ; XLoop
  14893. PerfGenBlit5bNormXLoop
  14894.       MOVE.l  -(a2),-(a3) ; Copy data
  14895.       MOVE.l  -(a4),-(a5) ; Copy stencil
  14896.       DBRA  d0,PerfGenBlit5bNormXLoop
  14897.     SUB.w d6,a2 ; Source linemod to data
  14898.     SUB.w d6,a4 ; Source linemod to stencil
  14899.     SUB.w d7,a3 ; Dest linemod to data
  14900.     SUB.w d7,a5 ; Dest linemod to stencil
  14901.     DBRA  d4,PerfGenBlit5bNormYLoop
  14902.   RTS;pop
  14903. PerfGenBlit5bNorm_16
  14904.   MOVE.w  d3,d0 ; Get Width
  14905.   ADD.w   d6,d0 ; Add source linemod
  14906.   MULU    d4,d0 ; Total bytes
  14907.   SUB.l   d6,d0 ; -Linemod of last line
  14908.   ADD.l   d0,a2 ; Add to source address
  14909.   MOVE.w  d3,d0 ; Get Width
  14910.   ADD.w   d7,d0 ; Add dest linemod
  14911.   MULU    d4,d0 ; Total bytes
  14912.   SUB.l   d7,d0 ; -Linemod of last line
  14913.   ADD.l   d0,a3 ; Add to dest address
  14914.   LSR.w   #4,d3 ; Width/16 for groups of 4 longwords
  14915.   SUBQ.w  #1,d4 ; YLoopcounter
  14916.   SUBQ.w  #1,d3 ; XLoopcounter
  14917. PerfGenBlit5bNorm_16YLoop
  14918.     MOVE.w  d3,d0 ; XLoop
  14919. PerfGenBlit5bNorm_16XLoop
  14920.       MOVE.l  -(a2),-(a3) ; Copy data
  14921.       MOVE.l  -(a4),-(a5) ; Copy stencil
  14922.       MOVE.l  -(a2),-(a3) ; Copy data
  14923.       MOVE.l  -(a4),-(a5) ; Copy stencil
  14924.       MOVE.l  -(a2),-(a3) ; Copy data
  14925.       MOVE.l  -(a4),-(a5) ; Copy stencil
  14926.       MOVE.l  -(a2),-(a3) ; Copy data
  14927.       MOVE.l  -(a4),-(a5) ; Copy stencil
  14928.       DBRA  d0,PerfGenBlit5bNorm_16XLoop
  14929.     SUB.w d6,a2 ; Source linemod to data
  14930.     SUB.w d6,a4 ; Source linemod to stencil
  14931.     SUB.w d7,a3 ; Dest linemod to data
  14932.     SUB.w d7,a5 ; Dest linemod to stencil
  14933.     DBRA  d4,PerfGenBlit5bNorm_16YLoop
  14934.   RTS
  14935.  
  14936. PerformGenericBlit5Custom
  14937. ;Do a general blit, width does not have to be multiple
  14938. ;Copies data and stencil, offsets each line using OffsetList
  14939. ;d3=Operation width (on which initial modulos are based)
  14940. ;d4=Operation height
  14941. ;d6=Source linemodulo
  14942. ;d7=Dest linemodulo
  14943. ;a2=Source data address
  14944. ;a3=Dest data address
  14945. ;a4=Source stencil address
  14946. ;a5=Dest stencil address
  14947. ;Trashes many
  14948.   MOVE.l  LongwordStore,a6 ; Get OffsetList.l
  14949.   SUBQ.w  #1,d4 ; YLoopcounter
  14950.   MOVE.w  d3,a0 ; Store specified width
  14951. PerfGenBlit5CustomYLoop
  14952.     MOVE.w  (a6)+,d3 ; Absolute width of line
  14953.     MOVE.w  a0,d1 ; Get specified width
  14954.     MOVE.w  d3,d5 ; Copy Width
  14955.     ADD.w   (a6),a2 ; Source X1 offset in data, relative to previous line
  14956.     SUB.w   d3,d1 ; Extra linemodulo to handle width change
  14957.     AND.w   #$03,d5 ; Only extra bytes
  14958.     ADD.w   (a6)+,a4 ; Source X1 offset in stencil, relative to previous line
  14959.     SUBQ.w  #1,d5 ; ByteLoop
  14960.     ADD.w   (a6),a3 ; Dest X2 offset in data, relative to previous line
  14961.     LSR.w   #2,d3 ; Width/4 for longwords
  14962.     ADD.w   (a6)+,a5 ; Dest X2 offset in stencil, relative to previous line
  14963.     SUBQ.w  #1,d3 ; XLoopcounter
  14964.     BLT     PerfGenBlit5CustomNoLongwords
  14965. PerfGenBlit5CustomXLoop
  14966.       MOVE.l  (a2)+,(a3)+ ; Copy data
  14967.       MOVE.l  (a4)+,(a5)+ ; Copy stencil
  14968.       DBRA  d3,PerfGenBlit5CustomXLoop
  14969. PerfGenBlit5CustomNoLongwords
  14970.     TST.w   d5 ; bytes?
  14971.     BLT     PerfGenBlit5CustomNoBytes
  14972. PerfGenBlit5CustomXLoop2
  14973.         MOVE.b  (a2)+,(a3)+ ; Copy data
  14974.         MOVE.b  (a4)+,(a5)+ ; Copy stencil
  14975.         DBRA    d5,PerfGenBlit5CustomXLoop2
  14976. PerfGenBlit5CustomNoBytes
  14977.     ADD.w d1,a2 ; Extra linemod in data caused by width change
  14978.     ADD.w d1,a3 ; Extra linemod in data caused by width change
  14979.     ADD.w (a6),a2 ; Absolute extra source data linemodulo
  14980.     ADD.w d1,a4 ; Extra linemod in stencil caused by width change
  14981.     ADD.w d1,a5 ; Extra linemod in stencil caused by width change
  14982.     ADD.w (a6)+,a4 ; Absolute extra source stencil linemodulo
  14983.     ADD.w d7,a3 ; Dest linemod to data
  14984.     ADD.w d6,a2 ; Source linemod to data
  14985.     ADD.w d7,a5 ; Dest linemod to stencil
  14986.     ADD.w d6,a4 ; Source linemod to stencil
  14987.     DBRA  d4,PerfGenBlit5CustomYLoop
  14988.   RTS ; pop
  14989.  
  14990. PerformGenericBlit5bCustom
  14991. ;Do a general blit, width does not have to be multiple
  14992. ;Copies data and stencil, offsets each line using OffsetList, as GenBlit5Custom but backwards
  14993. ;d3=Operation width (on which initial modulos are based)
  14994. ;d4=Operation height
  14995. ;d6=Source linemodulo
  14996. ;d7=Dest linemodulo
  14997. ;a2=Source data address
  14998. ;a3=Dest data address
  14999. ;a4=Source stencil address
  15000. ;a5=Dest stencil address
  15001. ;Trashes many
  15002.   MOVE.l  LongwordStore,a6 ; Get OffsetList.l
  15003.   MOVE.w  d3,d0 ; Get Width
  15004.   ADD.w   d6,d0 ; Add source linemod
  15005.   MULU    d4,d0 ; Total bytes
  15006.   SUB.l   d6,d0 ; -Linemod of last line
  15007.   ADD.l   d0,a2 ; Add to source address
  15008.   MOVE.w  d3,d0 ; Get Width
  15009.   ADD.w   d7,d0 ; Add dest linemod
  15010.   MULU    d4,d0 ; Total bytes
  15011.   SUB.l   d7,d0 ; -Linemod of last line
  15012.   ADD.l   d0,a3 ; Add to dest address
  15013.   SUBQ.w  #1,d4 ; YLoopcounter
  15014.   MOVE.w  d3,a0 ; Store specified width
  15015. PerfGenBlit5bCustomYLoop
  15016.     MOVE.w  (a6)+,d3 ; Absolute width of line
  15017.     MOVE.w  a0,d1 ; Get specified width
  15018.     MOVE.w  d3,d5 ; Copy Width
  15019.     ADD.w   (a6),a2 ; Source X1 offset in data, relative to previous line
  15020.     SUB.w   d3,d1 ; Extra linemodulo to handle width change
  15021.     AND.w   #$03,d5 ; Only extra bytes
  15022.     ADD.w   (a6)+,a4 ; Source X1 offset in stencil, relative to previous line
  15023.     SUBQ.w  #1,d5 ; ByteLoop
  15024.     ADD.w   (a6),a3 ; Dest X2 offset in data, relative to previous line
  15025.     LSR.w   #2,d3 ; Width/4 for longwords
  15026.     ADD.w   (a6)+,a5 ; Dest X2 offset in stencil, relative to previous line
  15027.     SUBQ.w  #1,d3 ; XLoopcounter
  15028.     BLT     PerfGenBlit5bCustomNoLongwords
  15029. PerfGenBlit5bCustomXLoop
  15030.       MOVE.l  -(a2),-(a3) ; Copy data
  15031.       MOVE.l  -(a4),-(a5) ; Copy stencil
  15032.       DBRA  d3,PerfGenBlit5bCustomXLoop
  15033. PerfGenBlit5bCustomNoLongwords
  15034.     TST.w   d5 ; bytes?
  15035.     BLT     PerfGenBlit5bCustomNoBytes
  15036. PerfGenBlit5bCustomXLoop2
  15037.         MOVE.b  -(a2),-(a3) ; Copy data
  15038.         MOVE.b  -(a4),-(a5) ; Copy stencil
  15039.         DBRA    d5,PerfGenBlit5bCustomXLoop2
  15040. PerfGenBlit5bCustomNoBytes
  15041.     SUB.w d1,a2 ; Extra linemod in data caused by width change
  15042.     SUB.w d1,a3 ; Extra linemod in data caused by width change
  15043.     ADD.w (a6),a2 ; Absolute extra source data linemodulo
  15044.     SUB.w d1,a4 ; Extra linemod in stencil caused by width change
  15045.     SUB.w d1,a5 ; Extra linemod in stencil caused by width chanage
  15046.     ADD.w (a6)+,a4 ; Absolute extra source stencil linemodulo
  15047.     SUB.w d7,a3 ; Dest linemod to data
  15048.     SUB.w d6,a2 ; Source linemod to data
  15049.     SUB.w d7,a5 ; Dest linemod to stencil
  15050.     SUB.w d6,a4 ; Source linemod to stencil
  15051.     DBRA  d4,PerfGenBlit5bCustomYLoop
  15052.   RTS ; pop
  15053.  
  15054. PerformGenericBlit6
  15055. ;Do a general stencil-blit, width should be multiple of 4
  15056. ;Stencil-copies both data and stencil/cookie
  15057. ;d3=Operation width
  15058. ;d4=Operation height
  15059. ;d6=Source linemodulo
  15060. ;d7=Dest linemodulo
  15061. ;a2=Source data address
  15062. ;a3=Dest data address
  15063. ;a4=Source stencil address
  15064. ;a5=Dest stencil address
  15065. ;Trashes many
  15066.   MOVE.w  SMaskScrollModeType,d0
  15067.   BRA     PerformBlit2
  15068.   RTS     ; Precaution
  15069.  
  15070. PerformGenericBlit6b ; Same as GenericBlit6 but in reverse
  15071. ;Do a general blit, width should be multiple of 4
  15072. ;Stencil-Copies both data and stencil/cookie
  15073. ;d3=Operation width
  15074. ;d4=Operation height
  15075. ;d6=Source linemodulo
  15076. ;d7=Dest linemodulo
  15077. ;a2=Source data address
  15078. ;a3=Dest data address
  15079. ;a4=Source stencil address
  15080. ;a5=Dest stencil address
  15081. ;Trashes many
  15082.   MOVE.w  SMaskScrollModeType,d0
  15083.   BRA     PerformBlit2b
  15084.   RTS     ; Precaution
  15085.  
  15086. PerformGenericBlit7
  15087. ;Do a general block-blit, width should be multiple of 16 and lie on 16-byte aligned addresses
  15088. ;Block-Copies data to data and stencil to stencil
  15089. ;d3=Operation width
  15090. ;d4=Operation height
  15091. ;d6=Source linemodulo
  15092. ;d7=Dest linemodulo
  15093. ;a2=Source data address
  15094. ;a3=Dest data address
  15095. ;a4=Source stencil address
  15096. ;a5=Dest stencil address
  15097. ;Trashes many
  15098.   MOVE.w  d3,d5 ; Copy width
  15099.   AND.b   #$3F,d5 ; Multiple of 64?
  15100.   BEQ     PerfGenBlit7_64
  15101.   LSR.w   #4,d3 ; Width/16 for groups of 4 longwords (16 bytes)
  15102.   SUBQ.w  #1,d3 ; XLoopcounter
  15103.   SUBQ.w  #1,d4 ; YLoopcounter
  15104.   TST.b   GeneralCPUmode
  15105.   BEQ     PerfGenBlit7_030
  15106. PerfGenBlit7_040
  15107. PerfGenBlit7_040YLoop
  15108.     MOVE.w  d3,d0 ; XLoop
  15109. PerfGenBlit7_040XLoop
  15110.       Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  15111.       Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  15112.       DBRA  d0,PerfGenBlit7_040XLoop
  15113.     ADD.w d6,a2 ; Source linemod to data
  15114.     ADD.w d6,a4 ; Source linemod to stencil
  15115.     ADD.w d7,a3 ; Dest linemod to data
  15116.     ADD.w d7,a5 ; Dest linemod to stencil
  15117.     DBRA  d4,PerfGenBlit7_040YLoop
  15118.   RTS;pop
  15119. PerfGenBlit7_030
  15120. PerfGenBlit7_030YLoop
  15121.     MOVE.w  d3,d0 ; XLoop
  15122. PerfGenBlit7_030XLoop
  15123.       MOVE.l  (a2)+,(a3)+ ; Copy 4 bytes data
  15124.       MOVE.l  (a4)+,(a5)+ ; Copy 4 bytes stencil
  15125.       MOVE.l  (a2)+,(a3)+ ; Copy 8 bytes data
  15126.       MOVE.l  (a4)+,(a5)+ ; Copy 8 bytes stencil
  15127.       MOVE.l  (a2)+,(a3)+ ; Copy 12 bytes data
  15128.       MOVE.l  (a4)+,(a5)+ ; Copy 12 bytes stencil
  15129.       MOVE.l  (a2)+,(a3)+ ; Copy 16 bytes data
  15130.       MOVE.l  (a4)+,(a5)+ ; Copy 16 bytes stencil
  15131.       DBRA  d0,PerfGenBlit7_030XLoop
  15132.     ADD.w d6,a2 ; Source linemod to data
  15133.     ADD.w d6,a4 ; Source linemod to stencil
  15134.     ADD.w d7,a3 ; Dest linemod to data
  15135.     ADD.w d7,a5 ; Dest linemod to stencil
  15136.     DBRA  d4,PerfGenBlit7_030YLoop
  15137.   RTS
  15138. PerfGenBlit7_64
  15139.   LSR.w   #6,d3 ; Width/64 for groups of 16 longwords (64 bytes)
  15140.   SUBQ.w  #1,d3 ; XLoopcounter
  15141.   SUBQ.w  #1,d4 ; YLoopcounter
  15142.   TST.b   GeneralCPUmode
  15143.   BEQ     PerfGenBlit7_64_030
  15144. PerfGenBlit7_64_040
  15145. PerfGenBlit7_64_040YLoop
  15146.     MOVE.w  d3,d0 ; XLoop
  15147. PerfGenBlit7_64_040XLoop
  15148.       Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  15149.       Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  15150.       Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  15151.       Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  15152.       Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  15153.       Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  15154.       Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+ ; 64 bytes
  15155.       Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+ ; 64 bytes
  15156.       DBRA  d0,PerfGenBlit7_64_040XLoop
  15157.     ADD.w d6,a2 ; Source linemod to data
  15158.     ADD.w d6,a4 ; Source linemod to stencil
  15159.     ADD.w d7,a3 ; Dest linemod to data
  15160.     ADD.w d7,a5 ; Dest linemod to stencil
  15161.     DBRA  d4,PerfGenBlit7_64_040YLoop
  15162.   RTS;pop
  15163. PerfGenBlit7_64_030
  15164. PerfGenBlit7_64_030YLoop
  15165.     MOVE.w  d3,d0 ; XLoop
  15166. PerfGenBlit7_64_030XLoop
  15167.       MOVE.l  (a2)+,(a3)+ ; 4 bytes data
  15168.       MOVE.l  (a4)+,(a5)+ ; 4 bytes stencil
  15169.       MOVE.l  (a2)+,(a3)+ ; 8 bytes data
  15170.       MOVE.l  (a4)+,(a5)+ ; 8 bytes stencil
  15171.       MOVE.l  (a2)+,(a3)+ ; 12 bytes data
  15172.       MOVE.l  (a4)+,(a5)+ ; 12 bytes stencil
  15173.       MOVE.l  (a2)+,(a3)+ ; 16 bytes data
  15174.       MOVE.l  (a4)+,(a5)+ ; 16 bytes stencil
  15175.       MOVE.l  (a2)+,(a3)+ ; 20 bytes data
  15176.       MOVE.l  (a4)+,(a5)+ ; 20 bytes stencil
  15177.       MOVE.l  (a2)+,(a3)+ ; 24 bytes data
  15178.       MOVE.l  (a4)+,(a5)+ ; 24 bytes stencil
  15179.       MOVE.l  (a2)+,(a3)+ ; 28 bytes data
  15180.       MOVE.l  (a4)+,(a5)+ ; 28 bytes stencil
  15181.       MOVE.l  (a2)+,(a3)+ ; 32 bytes data
  15182.       MOVE.l  (a4)+,(a5)+ ; 32 bytes stencil
  15183.       MOVE.l  (a2)+,(a3)+ ; 36 bytes data
  15184.       MOVE.l  (a4)+,(a5)+ ; 36 bytes stencil
  15185.       MOVE.l  (a2)+,(a3)+ ; 40 bytes data
  15186.       MOVE.l  (a4)+,(a5)+ ; 40 bytes stencil
  15187.       MOVE.l  (a2)+,(a3)+ ; 44 bytes data
  15188.       MOVE.l  (a4)+,(a5)+ ; 44 bytes stencil
  15189.       MOVE.l  (a2)+,(a3)+ ; 48 bytes data
  15190.       MOVE.l  (a4)+,(a5)+ ; 48 bytes stencil
  15191.       MOVE.l  (a2)+,(a3)+ ; 52 bytes data
  15192.       MOVE.l  (a4)+,(a5)+ ; 52 bytes stencil
  15193.       MOVE.l  (a2)+,(a3)+ ; 56 bytes data
  15194.       MOVE.l  (a4)+,(a5)+ ; 56 bytes stencil
  15195.       MOVE.l  (a2)+,(a3)+ ; 60 bytes data
  15196.       MOVE.l  (a4)+,(a5)+ ; 60 bytes stencil
  15197.       MOVE.l  (a2)+,(a3)+ ; 64 bytes data
  15198.       MOVE.l  (a4)+,(a5)+ ; 64 bytes stencil
  15199.       DBRA  d0,PerfGenBlit7_64_030XLoop
  15200.     ADD.w d6,a2 ; Source linemod to data
  15201.     ADD.w d6,a4 ; Source linemod to stencil
  15202.     ADD.w d7,a3 ; Dest linemod to data
  15203.     ADD.w d7,a5 ; Dest linemod to stencil
  15204.     DBRA  d4,PerfGenBlit7_64_030YLoop
  15205.   RTS
  15206.  
  15207. PerformGenericBlit7b ; As GenericBlit7 but in reverse
  15208. ;Do a general block-blit, width should be multiple of 16 and lie on 16-byte aligned addresses
  15209. ;Block-Copies data to data and stencil to stencil
  15210. ;d3=Operation width
  15211. ;d4=Operation height
  15212. ;d6=Source linemodulo
  15213. ;d7=Dest linemodulo
  15214. ;a2=Source data address
  15215. ;a3=Dest data address
  15216. ;a4=Source stencil address
  15217. ;a5=Dest stencil address
  15218. ;Trashes many
  15219.   MOVE.w  d3,d5 ; Copy width
  15220.   AND.b   #$3F,d5 ; Multiple of 64?
  15221.   BEQ     PerfGenBlit7b_64
  15222.   MOVE.w  d3,d0 ; Get Width
  15223.   ADD.w   d6,d0 ; Add source linemod
  15224.   MULU    d4,d0 ; Total bytes
  15225.   SUB.l   d6,d0 ; -Linemod of last line
  15226.   ADD.l   d0,a2 ; Add to source address
  15227.   ADD.l   d0,a4 ; Add to source stencil address
  15228.   MOVE.w  d3,d0 ; Get Width
  15229.   ADD.w   d7,d0 ; Add dest linemod
  15230.   MULU    d4,d0 ; Total bytes
  15231.   SUB.l   d7,d0 ; -Linemod of last line
  15232.   ADD.l   d0,a3 ; Add to dest address
  15233.   ADD.l   d0,a5 ; Add to dest stencil address
  15234.   LSR.w   #4,d3 ; Width/16 for groups of 4 longwords (16 bytes)
  15235.   SUBQ.w  #1,d3 ; XLoopcounter
  15236.   SUBQ.w  #1,d4 ; YLoopcounter
  15237.   TST.b   GeneralCPUmode
  15238.   BEQ     PerfGenBlit7b_030
  15239. PerfGenBlit7b_040
  15240.   SUB.w   #16,a2 ; Prepare first move16
  15241.   SUB.w   #16,a3 ; Prepare first move16
  15242.   SUB.w   #16,a4 ; Prepare first move16
  15243.   SUB.w   #16,a5 ; Prepare first move16
  15244.   MOVEQ.l #16*2,d1 ; Init temp
  15245. PerfGenBlit7b_040YLoop
  15246.     MOVE.w  d3,d0 ; XLoop
  15247. PerfGenBlit7b_040XLoop
  15248.       Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  15249.       Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  15250.       SUB.w d1,a2 ; Backpeddle
  15251.       SUB.w d1,a3 ; Backpeddle
  15252.       SUB.w d1,a4 ; Backpeddle
  15253.       SUB.w d1,a5 ; Backpeddle
  15254.       DBRA  d0,PerfGenBlit7b_040XLoop
  15255.     SUB.w d6,a2 ; Source linemod from data
  15256.     SUB.w d6,a4 ; Source linemod from stencil
  15257.     SUB.w d7,a3 ; Dest linemod from data
  15258.     SUB.w d7,a5 ; Dest linemod from stencil
  15259.     DBRA  d4,PerfGenBlit7b_040YLoop
  15260.   RTS;pop
  15261. PerfGenBlit7b_030
  15262. PerfGenBlit7b_030YLoop
  15263.     MOVE.w  d3,d0 ; XLoop
  15264. PerfGenBlit7b_030XLoop
  15265.       MOVE.l  -(a2),-(a3) ; Copy 4 bytes data
  15266.       MOVE.l  -(a4),-(a5) ; Copy 4 bytes stencil
  15267.       MOVE.l  -(a2),-(a3) ; Copy 8 bytes data
  15268.       MOVE.l  -(a4),-(a5) ; Copy 8 bytes stencil
  15269.       MOVE.l  -(a2),-(a3) ; Copy 12 bytes data
  15270.       MOVE.l  -(a4),-(a5) ; Copy 12 bytes stencil
  15271.       MOVE.l  -(a2),-(a3) ; Copy 16 bytes data
  15272.       MOVE.l  -(a4),-(a5) ; Copy 16 bytes stencil
  15273.       DBRA  d0,PerfGenBlit7b_030XLoop
  15274.     SUB.w d6,a2 ; Source linemod from data
  15275.     SUB.w d6,a4 ; Source linemod from stencil
  15276.     SUB.w d7,a3 ; Dest linemod from data
  15277.     SUB.w d7,a5 ; Dest linemod from stencil
  15278.     DBRA  d4,PerfGenBlit7b_030YLoop
  15279.   RTS
  15280. PerfGenBlit7b_64
  15281.   MOVE.w  d3,d0 ; Get Width
  15282.   ADD.w   d6,d0 ; Add source linemod
  15283.   MULU    d4,d0 ; Total bytes
  15284.   SUB.l   d6,d0 ; -Linemod of last line
  15285.   ADD.l   d0,a2 ; Add to source address
  15286.   ADD.l   d0,a4 ; Add to source stencil address
  15287.   MOVE.w  d3,d0 ; Get Width
  15288.   ADD.w   d7,d0 ; Add dest linemod
  15289.   MULU    d4,d0 ; Total bytes
  15290.   SUB.l   d7,d0 ; -Linemod of last line
  15291.   ADD.l   d0,a3 ; Add to dest address
  15292.   ADD.l   d0,a5 ; Add to dest stencil address
  15293.   LSR.w   #4,d3 ; Width/16 for groups of 4 longwords (16 bytes)
  15294.   SUBQ.w  #1,d3 ; XLoopcounter
  15295.   SUBQ.w  #1,d4 ; YLoopcounter
  15296.   TST.b   GeneralCPUmode
  15297.   BEQ     PerfGenBlit7b_64_030
  15298. PerfGenBlit7b_64_040
  15299.   SUB.w   #64,a2 ; Prepare first move16
  15300.   SUB.w   #64,a3 ; Prepare first move16
  15301.   ADD.w   #64,a4 ; Prepare first move16
  15302.   ADD.w   #64,a5 ; Prepare first move16
  15303.   MOVE.l  #64*2,d1 ; Init temp
  15304. PerfGenBlit7b_64_040YLoop
  15305.     MOVE.w  d3,d0 ; XLoop
  15306. PerfGenBlit7b_64_040XLoop
  15307.       SUB.w d1,a4 ; Backpeddle
  15308.       Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  15309.       SUB.w d1,a5 ; Backpeddle
  15310.       Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  15311.       Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  15312.       Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  15313.       Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  15314.       Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  15315.       Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+ ; 64 bytes
  15316.       Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+ ; 64 bytes
  15317.       SUB.w d1,a2 ; Backpeddle
  15318.       SUB.w d1,a3 ; Backpeddle
  15319.       DBRA  d0,PerfGenBlit7b_64_040XLoop
  15320.     SUB.w d6,a2 ; Source linemod from data
  15321.     SUB.w d6,a4 ; Source linemod from stencil
  15322.     SUB.w d7,a3 ; Dest linemod from data
  15323.     SUB.w d7,a5 ; Dest linemod from stencil
  15324.     DBRA  d4,PerfGenBlit7b_64_040YLoop
  15325.   RTS;pop
  15326. PerfGenBlit7b_64_030
  15327. PerfGenBlit7b_64_030YLoop
  15328.     MOVE.w  d3,d0 ; XLoop
  15329. PerfGenBlit7b_64_030XLoop
  15330.       MOVE.l  -(a2),-(a3) ; 4 bytes data
  15331.       MOVE.l  -(a4),-(a5) ; 4 bytes stencil
  15332.       MOVE.l  -(a2),-(a3) ; 8 bytes data
  15333.       MOVE.l  -(a4),-(a5) ; 8 bytes stencil
  15334.       MOVE.l  -(a2),-(a3) ; 12 bytes data
  15335.       MOVE.l  -(a4),-(a5) ; 12 bytes stencil
  15336.       MOVE.l  -(a2),-(a3) ; 16 bytes data
  15337.       MOVE.l  -(a4),-(a5) ; 16 bytes stencil
  15338.       MOVE.l  -(a2),-(a3) ; 20 bytes data
  15339.       MOVE.l  -(a4),-(a5) ; 20 bytes stencil
  15340.       MOVE.l  -(a2),-(a3) ; 24 bytes data
  15341.       MOVE.l  -(a4),-(a5) ; 24 bytes stencil
  15342.       MOVE.l  -(a2),-(a3) ; 28 bytes data
  15343.       MOVE.l  -(a4),-(a5) ; 28 bytes stencil
  15344.       MOVE.l  -(a2),-(a3) ; 32 bytes data
  15345.       MOVE.l  -(a4),-(a5) ; 32 bytes stencil
  15346.       MOVE.l  -(a2),-(a3) ; 36 bytes data
  15347.       MOVE.l  -(a4),-(a5) ; 36 bytes stencil
  15348.       MOVE.l  -(a2),-(a3) ; 40 bytes data
  15349.       MOVE.l  -(a4),-(a5) ; 40 bytes stencil
  15350.       MOVE.l  -(a2),-(a3) ; 44 bytes data
  15351.       MOVE.l  -(a4),-(a5) ; 44 bytes stencil
  15352.       MOVE.l  -(a2),-(a3) ; 48 bytes data
  15353.       MOVE.l  -(a4),-(a5) ; 48 bytes stencil
  15354.       MOVE.l  -(a2),-(a3) ; 52 bytes data
  15355.       MOVE.l  -(a4),-(a5) ; 52 bytes stencil
  15356.       MOVE.l  -(a2),-(a3) ; 56 bytes data
  15357.       MOVE.l  -(a4),-(a5) ; 56 bytes stencil
  15358.       MOVE.l  -(a2),-(a3) ; 60 bytes data
  15359.       MOVE.l  -(a4),-(a5) ; 60 bytes stencil
  15360.       MOVE.l  -(a2),-(a3) ; 64 bytes data
  15361.       MOVE.l  -(a4),-(a5) ; 64 bytes stencil
  15362.       DBRA  d0,PerfGenBlit7b_64_030XLoop
  15363.     SUB.w d6,a2 ; Source linemod from data
  15364.     SUB.w d6,a4 ; Source linemod from stencil
  15365.     SUB.w d7,a3 ; Dest linemod from data
  15366.     SUB.w d7,a5 ; Dest linemod from stencil
  15367.     DBRA  d4,PerfGenBlit7b_64_030YLoop
  15368.   RTS
  15369.  
  15370. PerformGenericBlit8
  15371. ;Do a general blit, width doesn't need to be multiple
  15372. ;Copies data with cut using destination stencil/cookie
  15373. ;d3=Operation width
  15374. ;d4=Operation height
  15375. ;d6=Source linemodulo
  15376. ;d7=Dest linemodulo
  15377. ;a2=Source data address
  15378. ;a3=Dest data address
  15379. ;a5=Dest stencil address
  15380. ;Trashes many
  15381.   MOVE.w  d3,d5 ; Copy Width
  15382.   AND.w   #$03,d5 ; Only extra bytes
  15383.   SUBQ.w  #1,d5 ; ByteLoop
  15384.   LSR.w   #2,d3 ; Width/4 for longwords
  15385.   SUBQ.w  #1,d4 ; YLoopcounter
  15386.   SUBQ.w  #1,d3 ; XLoopcounter
  15387.   BLT     PerfGenBlit8NoLongwords
  15388.   MOVE.l  a6,-(a7) ; Store
  15389.   MOVE.w  d3,a6
  15390. PerfGenBlit8YLoop
  15391.     MOVE.w  a6,d0 ; XLoop
  15392. PerfGenBlit8XLoop
  15393.       MOVE.l  (a5)+,d2 ; Get dest stencil
  15394.       MOVE.l  (a2)+,d1 ; Get source data
  15395.       AND.l   d2,d1 ; Mask source
  15396.       MOVE.l  (a3),d3 ; Get dest data
  15397.       NOT.l   d2 ; Invert mask
  15398.       AND.l   d2,d3 ; Mask dest
  15399.       OR.l    d1,d3 ; Combine
  15400.       MOVE.l  d3,(a3)+ ; Write
  15401.       DBRA    d0,PerfGenBlit8XLoop
  15402.     TST.w   d5 ; bytes?
  15403.     BLT     PerfGenBlit8NoBytes
  15404.       MOVE.w  d5,d0 ; XLoop
  15405. PerfGenBlit8XLoop2
  15406.         MOVE.b  (a5)+,d2 ; Get dest stencil
  15407.         MOVE.b  (a2)+,d1 ; Get source data
  15408.         AND.b   d2,d1 ; Mask source
  15409.         MOVE.b  (a3),d3 ; Get dest data
  15410.         NOT.b   d2 ; Invert mask
  15411.         AND.b   d2,d3 ; Mask dest
  15412.         OR.b    d1,d3 ; Combine
  15413.         MOVE.b  d3,(a3)+ ; Write
  15414.         DBRA    d0,PerfGenBlit8XLoop2
  15415. PerfGenBlit8NoBytes
  15416.     ADD.w d6,a2 ; Source linemod to data
  15417.     ADD.w d7,a3 ; Dest linemod to data
  15418.     ADD.w d7,a5 ; Dest linemod to stencil
  15419.     DBRA  d4,PerfGenBlit8YLoop
  15420.   MOVE.l  (a7)+,a6 ; Restore
  15421.   RTS ; pop
  15422. PerfGenBlit8NoLongwords
  15423.   TST.w   d5 ; Any bytes?
  15424.   BLT     PerfGenBlit8NoBytes2
  15425. PerfGenBlit8YLoop2
  15426.     MOVE.w  d5,d0 ; XLoop
  15427. PerfGenBlit8XLoop3
  15428.       MOVE.b  (a5)+,d2 ; Get dest stencil
  15429.       MOVE.b  (a2)+,d1 ; Get source data
  15430.       AND.b   d2,d1 ; Mask source
  15431.       MOVE.b  (a3),d3 ; Get dest data
  15432.       NOT.b   d2 ; Invert mask
  15433.       AND.b   d2,d3 ; Mask dest
  15434.       OR.b    d1,d3 ; Combine
  15435.       MOVE.b  d3,(a3)+ ; Write
  15436.       DBRA    d0,PerfGenBlit8XLoop3
  15437.     ADD.w d6,a2 ; Source linemod to data
  15438.     ADD.w d7,a3 ; Dest linemod to data
  15439.     ADD.w d7,a5 ; Dest linemod to stencil
  15440.     DBRA  d4,PerfGenBlit8YLoop2
  15441. PerfGenBlit8NoBytes2
  15442.   RTS
  15443.  
  15444. PerformGenericBlit8b ; Same as GenericBlit8 but in reverse
  15445. ;Do a general blit, width should be multiple of 4
  15446. ;Copies data with cut using destination stencil/cookie
  15447. ;d3=Operation width
  15448. ;d4=Operation height
  15449. ;d6=Source linemodulo
  15450. ;d7=Dest linemodulo
  15451. ;a2=Source data address
  15452. ;a3=Dest data address
  15453. ;a5=Dest stencil address
  15454. ;Trashes many
  15455.   MOVE.w  d3,d5 ; Copy Width
  15456.   AND.w   #$03,d5 ; Only extra bytes
  15457.   SUBQ.w  #1,d5 ; ByteLoop
  15458.   MOVE.w  d3,d0 ; Get Width
  15459.   ADD.w   d6,d0 ; Add source linemod
  15460.   MULU    d4,d0 ; Total bytes
  15461.   SUB.l   d6,d0 ; -Linemod of last line
  15462.   ADD.l   d0,a2 ; Add to source address
  15463.   MOVE.w  d3,d0 ; Get Width
  15464.   ADD.w   d7,d0 ; Add dest linemod
  15465.   MULU    d4,d0 ; Total bytes
  15466.   SUB.l   d7,d0 ; -Linemod of last line
  15467.   ADD.l   d0,a3 ; Add to dest address
  15468.   ADD.l   d0,a5 ; Add to dest stencil address
  15469.   LSR.w   #2,d3 ; Width/4 for longwords
  15470.   SUBQ.w  #1,d4 ; YLoopcounter
  15471.   SUBQ.w  #1,d3 ; XLoopcounter
  15472.   BLT     PerfGenBlit8bNoLongwords
  15473.   MOVE.l  a6,-(a7) ; Store
  15474.   MOVE.w  d3,a6
  15475. PerfGenBlit8bYLoop
  15476.     MOVE.w  a6,d0 ; XLoop
  15477. PerfGenBlit8bXLoop
  15478.       MOVE.l  -(a5),d2 ; Get dest stencil
  15479.       MOVE.l  -(a2),d1 ; Get source data
  15480.       AND.l   d2,d1 ; Mask source
  15481.       MOVE.l  -(a3),d3 ; Get dest data
  15482.       NOT.l   d2 ; Invert mask
  15483.       AND.l   d2,d3 ; Mask dest
  15484.       OR.l    d1,d3 ; Combine
  15485.       MOVE.l  d3,(a3) ; Write
  15486.       DBRA    d0,PerfGenBlit8bXLoop
  15487.     TST.w   d5 ; bytes?
  15488.     BLT     PerfGenBlit8bNoBytes
  15489.       MOVE.w  d5,d0 ; XLoop
  15490. PerfGenBlit8bXLoop2
  15491.         MOVE.b  -(a5),d2 ; Get dest stencil
  15492.         MOVE.b  -(a2),d1 ; Get source data
  15493.         AND.b   d2,d1 ; Mask source
  15494.         MOVE.b  -(a3),d3 ; Get dest data
  15495.         NOT.b   d2 ; Invert mask
  15496.         AND.b   d2,d3 ; Mask dest
  15497.         OR.b    d1,d3 ; Combine
  15498.         MOVE.b  d3,(a3) ; Write
  15499.         DBRA    d0,PerfGenBlit8bXLoop2
  15500. PerfGenBlit8bNoBytes
  15501.     SUB.w d6,a2 ; Source linemod to data
  15502.     SUB.w d7,a3 ; Dest linemod to data
  15503.     SUB.w d7,a5 ; Dest linemod to stencil
  15504.     DBRA  d4,PerfGenBlit8bYLoop
  15505.   MOVE.l  (a7)+,a6 ; Restore
  15506.   RTS ; pop
  15507. PerfGenBlit8bNoLongwords
  15508.   TST.w   d5 ; Any bytes?
  15509.   BLT     PerfGenBlit8bNoBytes2
  15510. PerfGenBlit8bYLoop2
  15511.     MOVE.w  d5,d0 ; XLoop
  15512. PerfGenBlit8bXLoop3
  15513.       MOVE.b  -(a5),d2 ; Get dest stencil
  15514.       MOVE.b  -(a2),d1 ; Get source data
  15515.       AND.b   d2,d1 ; Mask source
  15516.       MOVE.b  -(a3),d3 ; Get dest data
  15517.       NOT.b   d2 ; Invert mask
  15518.       AND.b   d2,d3 ; Mask dest
  15519.       OR.b    d1,d3 ; Combine
  15520.       MOVE.b  d3,(a3) ; Write
  15521.       DBRA    d0,PerfGenBlit8bXLoop3
  15522.     SUB.w d6,a2 ; Source linemod to data
  15523.     SUB.w d7,a3 ; Dest linemod to data
  15524.     SUB.w d7,a5 ; Dest linemod to stencil
  15525.     DBRA  d4,PerfGenBlit8bYLoop2
  15526. PerfGenBlit8bNoBytes2
  15527.   RTS
  15528.  
  15529. PerformGenericBlit8Custom
  15530. ;Do a general blit, width does not have to be multiple
  15531. ;Copies data with stencil cut, offsets each line using OffsetList
  15532. ;d3=Operation width (on which initial modulos are based)
  15533. ;d4=Operation height
  15534. ;d6=Source linemodulo
  15535. ;d7=Dest linemodulo
  15536. ;a2=Source data address
  15537. ;a3=Dest data address
  15538. ;a5=Dest stencil address
  15539. ;Trashes many
  15540.   MOVE.l  LongwordStore,a6 ; Get OffsetList.l
  15541.   SUBQ.w  #1,d4 ; YLoopcounter
  15542.   MOVE.w  d3,a0 ; Store specified width
  15543. PerfGenBlit8CustomYLoop
  15544.     MOVE.w  (a6)+,d3 ; Absolute width of line
  15545.     MOVE.l  a0,a1 ; Get specified width
  15546.     MOVE.w  d3,d5 ; Copy Width
  15547.     ADD.w   (a6)+,a2 ; Source X1 offset in data, relative to previous line
  15548.     SUB.w   d3,a1 ; Extra linemodulo to handle width change
  15549.     AND.w   #$03,d5 ; Only extra bytes
  15550.     SUBQ.w  #1,d5 ; ByteLoop
  15551.     ADD.w   (a6),a3 ; Dest X2 offset in data, relative to previous line
  15552.     LSR.w   #2,d3 ; Width/4 for longwords
  15553.     ADD.w   (a6)+,a5 ; Dest X2 offset in stencil, relative to previous line
  15554.     SUBQ.w  #1,d3 ; XLoopcounter
  15555.     BLT     PerfGenBlit8CustomNoLongwords
  15556. PerfGenBlit8CustomXLoop
  15557.       MOVE.l  (a5)+,d2 ; Get dest stencil
  15558.       MOVE.l  (a2)+,d1 ; Get source data
  15559.       AND.l   d2,d1 ; Mask source
  15560.       MOVE.l  (a3),d0 ; Get dest data
  15561.       NOT.l   d2 ; Invert mask
  15562.       AND.l   d2,d0 ; Mask dest
  15563.       OR.l    d1,d0 ; Combine
  15564.       MOVE.l  d0,(a3)+ ; Write
  15565.       DBRA  d3,PerfGenBlit8CustomXLoop
  15566. PerfGenBlit8CustomNoLongwords
  15567.     TST.w   d5 ; bytes?
  15568.     BLT     PerfGenBlit8CustomNoBytes
  15569. PerfGenBlit8CustomXLoop2
  15570.         MOVE.b  (a5)+,d2 ; Get dest stencil
  15571.         MOVE.b  (a2)+,d1 ; Get source data
  15572.         AND.b   d2,d1 ; Mask source
  15573.         MOVE.b  (a3),d3 ; Get dest data
  15574.         NOT.b   d2 ; Invert mask
  15575.         AND.b   d2,d3 ; Mask dest
  15576.         OR.b    d1,d3 ; Combine
  15577.         MOVE.b  d3,(a3)+ ; Write
  15578.         DBRA    d5,PerfGenBlit8CustomXLoop2
  15579. PerfGenBlit8CustomNoBytes
  15580.     ADD.l a1,a2 ; Extra linemod in data caused by width change
  15581.     ADD.l a1,a3 ; Extra linemod in data caused by width change
  15582.     ADD.w (a6)+,a2 ; Absolute extra source data linemodulo
  15583.     ADD.l a1,a5 ; Extra linemod in stencil caused by width change
  15584.     ADD.w d7,a3 ; Dest linemod to data
  15585.     ADD.w d6,a2 ; Source linemod to data
  15586.     ADD.w d7,a5 ; Dest linemod to stencil
  15587.     DBRA  d4,PerfGenBlit8CustomYLoop
  15588.   RTS ; pop
  15589.  
  15590. PerformGenericBlit8bCustom
  15591. ;Do a general blit, width does not have to be multiple
  15592. ;Copies data with stencil cut, offsets each line using OffsetList, as GenBlit8Custom but backwards
  15593. ;d3=Operation width (on which initial modulos are based)
  15594. ;d4=Operation height
  15595. ;d6=Source linemodulo
  15596. ;d7=Dest linemodulo
  15597. ;a2=Source data address
  15598. ;a3=Dest data address
  15599. ;a5=Dest stencil address
  15600. ;Trashes many
  15601.   MOVE.l  LongwordStore,a6 ; Get OffsetList.l
  15602.   MOVE.w  d3,d0 ; Get Width
  15603.   ADD.w   d6,d0 ; Add source linemod
  15604.   MULU    d4,d0 ; Total bytes
  15605.   SUB.l   d6,d0 ; -Linemod of last line
  15606.   ADD.l   d0,a2 ; Add to source address
  15607.   MOVE.w  d3,d0 ; Get Width
  15608.   ADD.w   d7,d0 ; Add dest linemod
  15609.   MULU    d4,d0 ; Total bytes
  15610.   SUB.l   d7,d0 ; -Linemod of last line
  15611.   ADD.l   d0,a3 ; Add to dest address
  15612.   SUBQ.w  #1,d4 ; YLoopcounter
  15613.   MOVE.w  d3,a0 ; Store specified width
  15614. PerfGenBlit8bCustomYLoop
  15615.     MOVE.w  (a6)+,d3 ; Absolute width of line
  15616.     MOVE.l  a0,a1 ; Get specified width
  15617.     MOVE.w  d3,d5 ; Copy Width
  15618.     ADD.w   (a6),a2 ; Source X1 offset in data, relative to previous line
  15619.     SUB.w   d3,a1 ; Extra linemodulo to handle width change
  15620.     AND.w   #$03,d5 ; Only extra bytes
  15621.     ADD.w   (a6)+,a4 ; Source X1 offset in stencil, relative to previous line
  15622.     SUBQ.w  #1,d5 ; ByteLoop
  15623.     ADD.w   (a6),a3 ; Dest X2 offset in data, relative to previous line
  15624.     LSR.w   #2,d3 ; Width/4 for longwords
  15625.     ADD.w   (a6)+,a5 ; Dest X2 offset in stencil, relative to previous line
  15626.     SUBQ.w  #1,d3 ; XLoopcounter
  15627.     BLT     PerfGenBlit8bCustomNoLongwords
  15628. PerfGenBlit8bCustomXLoop
  15629.       MOVE.l  -(a5),d2 ; Get dest stencil
  15630.       MOVE.l  -(a2),d1 ; Get source data
  15631.       AND.l   d2,d1 ; Mask source
  15632.       MOVE.l  -(a3),d0 ; Get dest data
  15633.       NOT.l   d2 ; Invert mask
  15634.       AND.l   d2,d0 ; Mask dest
  15635.       OR.l    d1,d0 ; Combine
  15636.       MOVE.l  d0,(a3) ; Write
  15637.       DBRA  d3,PerfGenBlit8bCustomXLoop
  15638. PerfGenBlit8bCustomNoLongwords
  15639.     TST.w   d5 ; bytes?
  15640.     BLT     PerfGenBlit8bCustomNoBytes
  15641. PerfGenBlit8bCustomXLoop2
  15642.         MOVE.b  -(a5),d2 ; Get dest stencil
  15643.         MOVE.b  -(a2),d1 ; Get source data
  15644.         AND.b   d2,d1 ; Mask source
  15645.         MOVE.b  -(a3),d3 ; Get dest data
  15646.         NOT.b   d2 ; Invert mask
  15647.         AND.b   d2,d3 ; Mask dest
  15648.         OR.b    d1,d3 ; Combine
  15649.         MOVE.b  d3,(a3) ; Write
  15650.         DBRA    d5,PerfGenBlit8bCustomXLoop2
  15651. PerfGenBlit8bCustomNoBytes
  15652.     SUB.l a1,a2 ; Extra linemod in data caused by width change
  15653.     SUB.l a1,a3 ; Extra linemod in data caused by width change
  15654.     ADD.w (a6),a2 ; Absolute extra source data linemodulo
  15655.     SUB.l a1,a4 ; Extra linemod in stencil caused by width change
  15656.     SUB.l a1,a5 ; Extra linemod in stencil caused by width chanage
  15657.     ADD.w (a6)+,a4 ; Absolute extra source stencil linemodulo
  15658.     SUB.w d7,a3 ; Dest linemod to data
  15659.     SUB.w d6,a2 ; Source linemod to data
  15660.     SUB.w d7,a5 ; Dest linemod to stencil
  15661.     SUB.w d6,a4 ; Source linemod to stencil
  15662.     DBRA  d4,PerfGenBlit8bCustomYLoop
  15663.   RTS ; pop
  15664.  
  15665. PerformGenericBlit9
  15666. ;Do a general stencil-blit, width should be multiple of 4
  15667. ;Stencil-copies data and additionally cuts using destination stencil/cookie
  15668. ;d3=Operation width
  15669. ;d4=Operation height
  15670. ;d6=Source linemodulo
  15671. ;d7=Dest linemodulo
  15672. ;a2=Source data address
  15673. ;a3=Dest data address
  15674. ;a4=Source stencil address
  15675. ;a5=Dest stencil address
  15676. ;Trashes many, particularly a1
  15677.   MOVE.w  SMaskScrollModeType,d0
  15678.   BRA     PerformBlit3
  15679.   RTS     ; Precaution
  15680.  
  15681. PerformGenericBlit9b ; Same as GenericBlit9 but in reverse
  15682. ;Do a general blit, width should be multiple of 4
  15683. ;Stencil-copies data and additionally cuts using destination stencil/cookie
  15684. ;d3=Operation width
  15685. ;d4=Operation height
  15686. ;d6=Source linemodulo
  15687. ;d7=Dest linemodulo
  15688. ;a2=Source data address
  15689. ;a3=Dest data address
  15690. ;a4=Source stencil address
  15691. ;a5=Dest stencil address
  15692. ;Trashes many
  15693.   MOVE.w  SMaskScrollModeType,d0
  15694.   BRA     PerformBlit3b
  15695.   RTS     ; Precaution
  15696.  
  15697. PerformGenericBlit10
  15698. ;Do a general block-blit, width should be multiple of 16 and lie on 16-byte aligned addresses
  15699. ;BlockCopies data with cut using dest's stencil/cookie. Ignores CPU type as move16 isn't useable
  15700. ;d3=Operation width
  15701. ;d4=Operation height
  15702. ;d6=Source linemodulo
  15703. ;d7=Dest linemodulo
  15704. ;a2=Source data address
  15705. ;a3=Dest data address
  15706. ;a5=Dest stencil address
  15707. ;Trashes many
  15708.   LSR.w   #4,d3 ; Width/16 for groups of 4 longwords (16 bytes)
  15709.   SUBQ.w  #1,d3 ; XLoopcounter
  15710.   SUBQ.w  #1,d4 ; YLoopcounter
  15711. PerfGenBlit10
  15712.   MOVE.w  d3,a0
  15713. PerfGenBlit10YLoop
  15714.     MOVE.w  a0,d0 ; XLoop
  15715. PerfGenBlit10XLoop
  15716.       MOVE.l  (a5)+,d2 ; Get dest stencil
  15717.       MOVE.l  (a2)+,d1 ; Get source data
  15718.       AND.l   d2,d1 ; Mask source
  15719.       MOVE.l  (a3),d5 ; Get dest data
  15720.       NOT.l   d2 ; Invert mask
  15721.       AND.l   d2,d5 ; Mask dest
  15722.       MOVE.l  (a5)+,d2 ; Get dest stencil
  15723.       OR.l    d1,d5 ; Combine
  15724.       MOVE.l  (a2)+,d1 ; Get source data
  15725.       AND.l   d2,d1 ; Mask source
  15726.       MOVE.l  (a3),d3 ; Get dest data
  15727.       NOT.l   d2 ; Invert mask
  15728.       AND.l   d2,d3 ; Mask dest
  15729.       OR.l    d1,d3 ; Combine
  15730.       MOVE.l  d5,(a3)+ ; Write
  15731.       MOVE.l  d3,(a3)+ ; Write
  15732.       MOVE.l  (a5)+,d2 ; Get dest stencil
  15733.       MOVE.l  (a2)+,d1 ; Get source data
  15734.       AND.l   d2,d1 ; Mask source
  15735.       MOVE.l  (a3),d5 ; Get dest data
  15736.       NOT.l   d2 ; Invert mask
  15737.       AND.l   d2,d5 ; Mask dest
  15738.       MOVE.l  (a5)+,d2 ; Get dest stencil
  15739.       OR.l    d1,d5 ; Combine
  15740.       MOVE.l  (a2)+,d1 ; Get source data
  15741.       AND.l   d2,d1 ; Mask source
  15742.       MOVE.l  (a3),d3 ; Get dest data
  15743.       NOT.l   d2 ; Invert mask
  15744.       AND.l   d2,d3 ; Mask dest
  15745.       OR.l    d1,d3 ; Combine
  15746.       MOVE.l  d5,(a3)+ ; Write
  15747.       MOVE.l  d3,(a3)+ ; Write
  15748.       DBRA  d0,PerfGenBlit10XLoop
  15749.     ADD.w d6,a2 ; Source linemod to data
  15750.     ADD.w d7,a3 ; Dest linemod to data
  15751.     ADD.w d7,a5 ; Dest linemod to stencil
  15752.     DBRA  d4,PerfGenBlit10YLoop
  15753.   RTS
  15754.  
  15755. PerformGenericBlit10b ; As GenericBlit10 but in reverse
  15756. ;Do a general block-blit, width should be multiple of 16 and lie on 16-byte aligned addresses
  15757. ;BlockCopies data with cut using dest's stencil/cookie. Ignores CPU type as move16 isn't useable
  15758. ;d3=Operation width
  15759. ;d4=Operation height
  15760. ;d6=Source linemodulo
  15761. ;d7=Dest linemodulo
  15762. ;a2=Source data address
  15763. ;a3=Dest data address
  15764. ;a5=Dest stencil address
  15765. ;Trashes many
  15766.   MOVE.w  d3,d0 ; Get Width
  15767.   ADD.w   d6,d0 ; Add source linemod
  15768.   MULU    d4,d0 ; Total bytes
  15769.   SUB.l   d6,d0 ; -Linemod of last line
  15770.   ADD.l   d0,a2 ; Add to source address
  15771.   MOVE.w  d3,d0 ; Get Width
  15772.   ADD.w   d7,d0 ; Add dest linemod
  15773.   MULU    d4,d0 ; Total bytes
  15774.   SUB.l   d7,d0 ; -Linemod of last line
  15775.   ADD.l   d0,a3 ; Add to dest address
  15776.   ADD.l   d0,a5 ; Add to dest stencil address
  15777.   LSR.w   #4,d3 ; Width/16 for groups of 4 longwords (16 bytes)
  15778.   SUBQ.w  #1,d3 ; XLoopcounter
  15779.   SUBQ.w  #1,d4 ; YLoopcounter
  15780. PerfGenBlit10b
  15781.   MOVE.w  d3,a0
  15782. PerfGenBlit10bYLoop
  15783.     MOVE.w  a0,d0 ; XLoop
  15784. PerfGenBlit10bXLoop
  15785.       MOVE.l  -(a5),d2 ; Get dest stencil
  15786.       MOVE.l  -(a2),d1 ; Get source data
  15787.       AND.l   d2,d1 ; Mask source
  15788.       MOVE.l  -(a3),d5 ; Get dest data
  15789.       NOT.l   d2 ; Invert mask
  15790.       AND.l   d2,d5 ; Mask dest
  15791.       MOVE.l  -(a5),d2 ; Get dest stencil
  15792.       OR.l    d1,d5 ; Combine
  15793.       MOVE.l  -(a2),d1 ; Get source data
  15794.       AND.l   d2,d1 ; Mask source
  15795.       MOVE.l  -(a3),d3 ; Get dest data
  15796.       NOT.l   d2 ; Invert mask
  15797.       AND.l   d2,d3 ; Mask dest
  15798.       OR.l    d1,d3 ; Combine
  15799.       MOVE.l  d5,4(a3) ; Write
  15800.       MOVE.l  d3,(a3) ; Write
  15801.       MOVE.l  -(a5),d2 ; Get dest stencil
  15802.       MOVE.l  -(a2),d1 ; Get source data
  15803.       AND.l   d2,d1 ; Mask source
  15804.       MOVE.l  -(a3),d5 ; Get dest data
  15805.       NOT.l   d2 ; Invert mask
  15806.       AND.l   d2,d5 ; Mask dest
  15807.       MOVE.l  -(a5),d2 ; Get dest stencil
  15808.       OR.l    d1,d5 ; Combine
  15809.       MOVE.l  -(a2),d1 ; Get source data
  15810.       AND.l   d2,d1 ; Mask source
  15811.       MOVE.l  -(a3),d3 ; Get dest data
  15812.       NOT.l   d2 ; Invert mask
  15813.       AND.l   d2,d3 ; Mask dest
  15814.       OR.l    d1,d3 ; Combine
  15815.       MOVE.l  d5,4(a3) ; Write
  15816.       MOVE.l  d3,(a3) ; Write
  15817.       DBRA  d0,PerfGenBlit10bXLoop
  15818.     SUB.w d6,a2 ; Source linemod from data
  15819.     SUB.w d7,a3 ; Dest linemod from data
  15820.     SUB.w d7,a5 ; Dest linemod from stencil
  15821.     DBRA  d4,PerfGenBlit10bYLoop
  15822.   RTS
  15823.  
  15824. PerformBlit1
  15825. ;Do a `Blit' stencilled-blit, width should be multiple of 4
  15826. ;Copies data using stencil for cookie-cut, or straight copy if no source stencil
  15827. ;d0=BlitModeType
  15828. ;d3=Operation width
  15829. ;d4=Operation height
  15830. ;d6=Source linemodulo
  15831. ;d7=Dest linemodulo
  15832. ;a2=Source data address
  15833. ;a3=Dest data address
  15834. ;a4=Source stencil address
  15835. ;Trashes many
  15836.   MOVE.b  d3,d5 ; Copy Width
  15837.   AND.b   #$0F,d5 ; Width multiple of 16?
  15838.   BEQ     PerformBlit1_16
  15839.   LSR.w   #2,d3 ; Width/4 for longwords
  15840.   SUBQ.w  #1,d4 ; YLoopcounter
  15841.   SUBQ.w  #1,d3 ; XLoopcounter
  15842.   EXG.l   d0,a4 ; Get to data reg for test
  15843.   TST.l d0 ; Has cookie?
  15844.   BNE   PerfBlit1HasCookie
  15845. PerfBlit1NoCookieYLoop
  15846.     MOVE.w  d3,d0 ; XLoop
  15847. PerfBlit1NoCookieXLoop
  15848.       MOVE.l  (a2)+,(a3)+ ; Copy data
  15849.       DBRA    d0,PerfBlit1NoCookieXLoop
  15850.     ADD.w d6,a2
  15851.     ADD.w d7,a3
  15852.     DBRA  d4,PerfBlit1NoCookieYLoop
  15853.   RTS
  15854. PerfBlit1HasCookie
  15855.   EXG.l   d0,a4 ; Restore
  15856.   CMP.b   #1,d0 ; What type of blit?
  15857.   BEQ     PerfBlit1EraseYLoop
  15858.   BGT     PerfBlit1Check2
  15859. PerfBlit1CookieYLoop
  15860.     MOVE.w  d3,d0 ; XLoop
  15861. PerfBlit1CookieXLoop
  15862.       MOVE.l  (a3),d5 ; Get dest
  15863.       AND.l   (a4)+,d5 ; And mask
  15864.       OR.l    (a2)+,d5 ; Or data
  15865.       MOVE.l  d5,(a3)+ ; Output
  15866.       DBRA    d0,PerfBlit1CookieXLoop
  15867.     ADD.w d6,a2
  15868.     ADD.w d6,a4
  15869.     ADD.w d7,a3
  15870.     DBRA  d4,PerfBlit1CookieYLoop
  15871.   RTS
  15872. PerfBlit1EraseYLoop
  15873.     MOVE.w  d3,d0 ; XLoop
  15874. PerfBlit1EraseXLoop
  15875.       MOVE.l  (a4)+,d5 ; Get mask
  15876.       AND.l   d5,(a3)+ ; And mask with dest data
  15877.       DBRA    d0,PerfBlit1EraseXLoop
  15878.     ADD.w d6,a4
  15879.     ADD.w d7,a3
  15880.     DBRA  d4,PerfBlit1EraseYLoop
  15881.   RTS
  15882. PerfBlit1Check2 ; Do more type tests
  15883.   CMP.b   #3,d0 ; What type of blit?
  15884.   BEQ     PerfBlit1SolidYLoop
  15885.   BGT     PerfBlit1Check3
  15886. PerfBlit1InvYLoop
  15887.     MOVE.w  d3,d0 ; XLoop
  15888. PerfBlit1InvXLoop
  15889.       MOVE.l  (a4)+,d5 ; Get mask
  15890.       NOT.l   d5 ; Inverse mask for graphic
  15891.       EOR.l   d5,(a3)+ ; Xor mask with dest data
  15892.       DBRA    d0,PerfBlit1InvXLoop
  15893.     ADD.w d6,a4
  15894.     ADD.w d7,a3
  15895.     DBRA  d4,PerfBlit1InvYLoop
  15896.   RTS
  15897. PerfBlit1SolidYLoop
  15898.     MOVE.w  d3,d0 ; XLoop
  15899. PerfBlit1SolidXLoop
  15900.       MOVE.l  (a4)+,d5 ; Get mask
  15901.       NOT.l   d5 ; Inverse mask for graphic
  15902.       OR.l    d5,(a3)+ ; Or mask with dest data
  15903.       DBRA    d0,PerfBlit1SolidXLoop
  15904.     ADD.w d6,a4
  15905.     ADD.w d7,a3
  15906.     DBRA  d4,PerfBlit1SolidYLoop
  15907.   RTS
  15908. PerfBlit1Check3 ; Do more type tests
  15909.   CMP.b   #5,d0 ; What type of blit?
  15910.   BEQ     PerfBlit1Re_Map
  15911.   BGT     PerfBlit1Check4
  15912.   MOVE.b  CurrentInk1,d5
  15913.   MOVE.b  d5,d1
  15914.   LSL.w   #8,d5
  15915.   MOVE.b  d1,d5
  15916.   MOVE.w  d5,d1
  15917.   SWAP    d5
  15918.   MOVE.w  d1,d5
  15919.   MOVE.l  a5,-(a7) ; Store
  15920.   MOVE.w  d3,a5
  15921. PerfBlit1ColourYLoop
  15922.     MOVE.w  a5,d0 ; XLoop
  15923. PerfBlit1ColourXLoop
  15924.       MOVE.l  (a3),d3 ; Get dest
  15925.       MOVE.l  d5,d2 ; Copy colour
  15926.       MOVE.l  (a4)+,d1 ; Get mask
  15927.       AND.l   d1,d3 ; And with dest
  15928.       NOT.l   d1 ; Inverse mask
  15929.       AND.l   d1,d2 ; Make graphic
  15930.       OR.l    d2,d3 ; Combine
  15931.       MOVE.l  d3,(a3)+ ; Output
  15932.       DBRA    d0,PerfBlit1ColourXLoop
  15933.     ADD.w   d6,a4
  15934.     ADD.w   d7,a3
  15935.     DBRA    d4,PerfBlit1ColourYLoop
  15936.   MOVE.l  (a7)+,a5 ; Restore
  15937.   RTS
  15938. PerfBlit1Re_Map
  15939.   MOVE.w  CurrentChunkyTable1,d0
  15940.   !GetTableObjectPtr ; table base in a0
  15941.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0
  15942.   MOVE.w  d3,a1
  15943.   MOVEQ.l #0,d1
  15944.   MOVEQ.l #0,d2
  15945.   MOVEQ.l #0,d3
  15946.   MOVEQ.l #0,d5
  15947. PerfBlit1ReMapYLoop
  15948.     MOVE.w  a1,d0 ; XLoop
  15949. PerfBlit1ReMapXLoop
  15950.       MOVE.b  (a2)+,d1 ; Get data
  15951.       MOVE.b  (a2)+,d2 ; Get data
  15952.       LSL.w   #8,d1
  15953.       MOVE.b  (a2)+,d3 ; Get data
  15954.       LSL.w   #8,d2
  15955.       MOVE.b  (a2)+,d5 ; Get data
  15956.       LSL.w   #8,d3
  15957.       MOVE.b  (a3),d1
  15958.       LSL.w   #8,d5
  15959.       MOVE.b  1(a3),d2
  15960.       MOVE.b  2(a3),d3
  15961.       MOVE.b  3(a3),d5
  15962.       SUBQ.w  #1,d0
  15963.       BLT     PerfBlit1ReMapXSkip
  15964. PerfBlit1ReMapXXLoop
  15965.       MOVE.b  0(a0,d1.l),(a3)+
  15966.       MOVE.b  (a2)+,d1 ; Get data
  15967.       MOVE.b  0(a0,d2.l),(a3)+
  15968.       MOVE.b  (a2)+,d2 ; Get data
  15969.       MOVE.b  0(a0,d3.l),(a3)+
  15970.       LSL.w   #8,d1
  15971.       MOVE.b  0(a0,d5.l),(a3)+
  15972.       MOVE.b  (a2)+,d3 ; Get data
  15973.       LSL.w   #8,d2
  15974.       MOVE.b  (a2)+,d5 ; Get data
  15975.       LSL.w   #8,d3
  15976.       MOVE.b  (a3),d1
  15977.       LSL.w   #8,d5
  15978.       MOVE.b  1(a3),d2
  15979.       MOVE.b  2(a3),d3
  15980.       MOVE.b  3(a3),d5
  15981.       DBRA    d0,PerfBlit1ReMapXXLoop
  15982. PerfBlit1ReMapXSkip
  15983.     MOVE.b  0(a0,d1.l),(a3)+
  15984.     MOVE.b  0(a0,d2.l),(a3)+
  15985.     ADD.w d6,a2
  15986.     MOVE.b  0(a0,d3.l),(a3)+
  15987.     MOVE.b  0(a0,d5.l),(a3)+
  15988.     ADD.w d7,a3
  15989.     DBRA  d4,PerfBlit1ReMapYLoop
  15990.   RTS
  15991. PerfBlit1Check4
  15992.   CMP.b   #7,d0 ; What type of blit?
  15993.   BEQ     PerfBlit1_Add
  15994.   BGT     PerfBlit1Check5
  15995. PerfBlit1SimpleReMap
  15996.   MOVE.w  CurrentChunkyTable1,d0
  15997.   !GetTableObjectPtr ; table base in a0
  15998.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0
  15999.   MOVEQ.l #0,d1
  16000.   MOVEQ.l #0,d2
  16001.   MOVEQ.l #4,d5
  16002. PerfBlit1SimpleReMapYLoop
  16003.     MOVE.w  d3,d0 ; XLoop
  16004. PerfBlit1SimpleReMapXLoop
  16005.       TST.b   (a4)+ ; Mask?
  16006.       BNE     PerfBlit1SimpleReMapSkip1
  16007.       MOVE.b  (a3),d1 ; Get dest
  16008.       MOVE.b  0(a0,d1.w),(a3)
  16009. PerfBlit1SimpleReMapSkip1
  16010.       TST.b   (a4)+ ; Mask?
  16011.       BNE     PerfBlit1SimpleReMapSkip2
  16012.       MOVE.b  1(a3),d2 ; Get dest
  16013.       MOVE.b  0(a0,d2.w),1(a3)
  16014. PerfBlit1SimpleReMapSkip2
  16015.       TST.b   (a4)+ ; Mask?
  16016.       BNE     PerfBlit1SimpleReMapSkip3
  16017.       MOVE.b  2(a3),d1 ; Get dest
  16018.       MOVE.b  0(a0,d1.w),2(a3)
  16019. PerfBlit1SimpleReMapSkip3
  16020.       TST.b   (a4)+ ; Mask?
  16021.       BNE     PerfBlit1SimpleReMapSkip4
  16022.       MOVE.b  3(a3),d2 ; Get dest
  16023.       MOVE.b  0(a0,d2.w),3(a3)
  16024. PerfBlit1SimpleReMapSkip4
  16025.       ADD.w   d5,a3
  16026.       DBRA    d0,PerfBlit1SimpleReMapXLoop
  16027.     ADD.w d7,a3
  16028.     ADD.w d6,a4
  16029.     DBRA  d4,PerfBlit1SimpleReMapYLoop
  16030.   RTS
  16031. PerfBlit1_Add
  16032.   MOVEQ.l #4,d2 ; Skip value
  16033. PerfBlit1AddYLoop
  16034.     MOVE.w  d3,d0 ; XLoop
  16035. PerfBlit1AddXLoop
  16036.       MOVE.l  (a2)+,d1 ; Get source data
  16037.       ADD.b   d1,3(a3) ; Add to dest
  16038.       LSR.w   #8,d1
  16039.       ADD.b   d1,2(a3) ; Add to dest
  16040.       SWAP    d1
  16041.       ADD.b   d1,1(a3) ; Add to dest
  16042.       LSR.w   #8,d1
  16043.       ADD.b   d1,(a3) ; Add to dest
  16044.       ADD.l   d2,a3 ; Skip
  16045.       DBRA    d0,PerfBlit1AddXLoop
  16046.     ADD.w d6,a2
  16047.     ADD.w d7,a3
  16048.     DBRA  d4,PerfBlit1AddYLoop
  16049.   RTS
  16050. PerfBlit1Check5
  16051.   ; Next check
  16052.   RTS
  16053.  
  16054. PerformBlit1b
  16055. ;Do a `Blit' stencilled-blit, width should be multiple of 4, backwards
  16056. ;Copies data backwards using stencil for cookie-cut, or straight copy if no source stencil
  16057. ;d0=BlitModeType
  16058. ;d3=Operation width
  16059. ;d4=Operation height
  16060. ;d6=Source linemodulo
  16061. ;d7=Dest linemodulo
  16062. ;a2=Source data address
  16063. ;a3=Dest data address
  16064. ;a4=Source stencil address
  16065. ;Trashes many
  16066.   MOVE.b  d3,d5 ; Copy Width
  16067.   AND.b   #$0F,d5 ; Width multiple of 16?
  16068.   BEQ     PerformBlit1b_16
  16069.   MOVE.w  d3,d5 ; Get Width
  16070.   ADD.w   d6,d5 ; Add source linemod
  16071.   MULU    d4,d5 ; Total bytes
  16072.   SUB.l   d6,d5 ; -Linemod of last line
  16073.   ADD.l   d5,a2 ; Add to source address
  16074.   ADD.l   d5,a4 ; Add to source stencil address
  16075.   MOVE.w  d3,d5 ; Get Width
  16076.   ADD.w   d7,d5 ; Add dest linemod
  16077.   MULU    d4,d5 ; Total bytes
  16078.   SUB.l   d7,d5 ; -Linemod of last line
  16079.   ADD.l   d5,a3 ; Add to dest address
  16080.   LSR.w   #2,d3 ; Width/4 for longwords
  16081.   SUBQ.w  #1,d3 ; XLoopcounter
  16082.   SUBQ.w  #1,d4 ; YLoopcounter
  16083.   EXG.l   d0,a4 ; Get to data reg for test
  16084.   TST.l d0 ; Has cookie?
  16085.   BNE   PerfBlit1bHasCookie
  16086. PerfBlit1bNoCookieYLoop
  16087.     MOVE.w  d3,d0 ; XLoop
  16088. PerfBlit1bNoCookieXLoop
  16089.       MOVE.l  -(a2),-(a3) ; Copy data
  16090.       DBRA    d0,PerfBlit1bNoCookieXLoop
  16091.     ADD.w d6,a2
  16092.     ADD.w d7,a3
  16093.     DBRA  d4,PerfBlit1bNoCookieYLoop
  16094.   RTS
  16095. PerfBlit1bHasCookie
  16096.   EXG.l   d0,a4 ; Restore
  16097.   CMP.b   #1,d0 ; What type of blit?
  16098.   BEQ     PerfBlit1bEraseYLoop
  16099.   BGT     PerfBlit1bCheck2
  16100. PerfBlit1bCookieYLoop
  16101.     MOVE.w  d3,d0 ; XLoop
  16102. PerfBlit1bCookieXLoop
  16103.       MOVE.l  -(a3),d5 ; Get dest
  16104.       AND.l   -(a4),d5 ; And mask
  16105.       OR.l    -(a2),d5 ; Or data
  16106.       MOVE.l  d5,(a3) ; Output
  16107.       DBRA    d0,PerfBlit1bCookieXLoop
  16108.     SUB.w d6,a2
  16109.     SUB.w d6,a4
  16110.     SUB.w d7,a3
  16111.     DBRA  d4,PerfBlit1bCookieYLoop
  16112.   RTS
  16113. PerfBlit1bEraseYLoop
  16114.     MOVE.w  d3,d0 ; XLoop
  16115. PerfBlit1bEraseXLoop
  16116.       MOVE.l  -(a4),d5 ; Get mask
  16117.       AND.l   d5,-(a3) ; And mask with dest data
  16118.       DBRA    d0,PerfBlit1bEraseXLoop
  16119.     SUB.w d6,a4
  16120.     SUB.w d7,a3
  16121.     DBRA  d4,PerfBlit1bEraseYLoop
  16122.   RTS
  16123. PerfBlit1bCheck2 ; Do more type tests
  16124.   CMP.b   #3,d0 ; What type of blit?
  16125.   BEQ     PerfBlit1bSolidYLoop
  16126.   BGT     PerfBlit1bCheck3
  16127. PerfBlit1bInvYLoop
  16128.     MOVE.w  d3,d0 ; XLoop
  16129. PerfBlit1bInvXLoop
  16130.       MOVE.l  -(a4),d5 ; Get mask
  16131.       NOT.l   d5 ; Inverse mask for graphic
  16132.       EOR.l   d5,-(a3) ; Xor mask with dest data
  16133.       DBRA    d0,PerfBlit1bInvXLoop
  16134.     SUB.w d6,a4
  16135.     SUB.w d7,a3
  16136.     DBRA  d4,PerfBlit1bInvYLoop
  16137.   RTS
  16138. PerfBlit1bSolidYLoop
  16139.     MOVE.w  d3,d0 ; XLoop
  16140. PerfBlit1bSolidXLoop
  16141.       MOVE.l  -(a4),d5 ; Get mask
  16142.       NOT.l   d5 ; Inverse mask for graphic
  16143.       OR.l    d5,-(a3) ; Or mask with dest data
  16144.       DBRA    d0,PerfBlit1bSolidXLoop
  16145.     SUB.w d6,a4
  16146.     SUB.w d7,a3
  16147.     DBRA  d4,PerfBlit1bSolidYLoop
  16148.   RTS
  16149. PerfBlit1bCheck3
  16150.   CMP.b   #5,d0 ; What type of blit?
  16151.   BEQ     PerfBlit1bReMap
  16152.   BGT     PerfBlit1bCheck4
  16153.   MOVE.b  CurrentInk1,d5
  16154.   MOVE.b  d5,d1
  16155.   LSL.w   #8,d5
  16156.   MOVE.b  d1,d5
  16157.   MOVE.w  d5,d1
  16158.   SWAP    d5
  16159.   MOVE.w  d1,d5
  16160.   MOVE.l  a5,-(a7) ; Store
  16161.   MOVE.w  d3,a5
  16162. PerfBlit1bColourYLoop
  16163.     MOVE.w  a5,d0 ; XLoop
  16164. PerfBlit1bColourXLoop
  16165.       MOVE.l  -(a3),d3 ; Get dest
  16166.       MOVE.l  d5,d2 ; Copy colour
  16167.       MOVE.l  -(a4),d1 ; Get mask
  16168.       AND.l   d1,d3 ; And with dest
  16169.       NOT.l   d1 ; Inverse mask
  16170.       AND.l   d1,d2 ; Make graphic
  16171.       OR.l    d2,d3 ; Combine
  16172.       MOVE.l  d3,(a3) ; Output
  16173.       DBRA    d0,PerfBlit1bColourXLoop
  16174.     SUB.w   d6,a4
  16175.     SUB.w   d7,a3
  16176.     DBRA    d4,PerfBlit1bColourYLoop
  16177.   MOVE.l  (a7)+,a5 ; Restore
  16178.   RTS
  16179. PerfBlit1bReMap
  16180.   MOVE.w  CurrentChunkyTable1,d0
  16181.   !GetTableObjectPtr ; table base in a0
  16182.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0
  16183.   MOVE.w  d3,a1
  16184.   MOVEQ.l #0,d1
  16185.   MOVEQ.l #0,d2
  16186.   MOVEQ.l #0,d3
  16187.   MOVEQ.l #0,d5
  16188. PerfBlit1bReMapYLoop
  16189.     MOVE.w  a1,d0 ; XLoop
  16190. PerfBlit1bReMapXLoop
  16191.       MOVE.b  -(a2),d1 ; Get data
  16192.       MOVE.b  -(a2),d2 ; Get data
  16193.       LSL.w   #8,d1
  16194.       MOVE.b  -(a2),d3 ; Get data
  16195.       LSL.w   #8,d2
  16196.       MOVE.b  -(a2),d5 ; Get data
  16197.       LSL.w   #8,d3
  16198.       MOVE.b  -(a3),d1
  16199.       LSL.w   #8,d5
  16200.       MOVE.b  -(a3),d2
  16201.       MOVE.b  -(a3),d3
  16202.       MOVE.b  -(a3),d5
  16203.       SUB.w   #1,d0
  16204.       BLT     PerfBlit1bReMapXSkip
  16205. PerfBlit1bReMapXXLoop
  16206.       MOVE.b  0(a0,d1.l),3(a3)
  16207.       MOVE.b  -(a2),d1 ; Get data
  16208.       MOVE.b  0(a0,d2.l),2(a3)
  16209.       MOVE.b  -(a2),d2 ; Get data
  16210.       MOVE.b  0(a0,d3.l),1(a3)
  16211.       LSL.w   #8,d1
  16212.       MOVE.b  0(a0,d5.l),(a3)
  16213.       MOVE.b  -(a2),d3 ; Get data
  16214.       LSL.w   #8,d2
  16215.       MOVE.b  -(a2),d5 ; Get data
  16216.       LSL.w   #8,d3
  16217.       MOVE.b  -(a3),d1
  16218.       LSL.w   #8,d5
  16219.       MOVE.b  -(a3),d2
  16220.       MOVE.b  -(a3),d3
  16221.       MOVE.b  -(a3),d5
  16222.       DBRA    d0,PerfBlit1bReMapXXLoop
  16223. PerfBlit1bReMapXSkip
  16224.     MOVE.b  0(a0,d5.l),(a3)
  16225.     MOVE.b  0(a0,d3.l),1(a3)
  16226.     SUB.w d6,a2
  16227.     MOVE.b  0(a0,d2.l),2(a3)
  16228.     MOVE.b  0(a0,d1.l),3(a3)
  16229.     SUB.w d7,a3
  16230.     DBRA  d4,PerfBlit1bReMapYLoop
  16231.   RTS
  16232. PerfBlit1bCheck4
  16233.   CMP.b   #7,d0 ; What type of blit?
  16234.   BEQ     PerfBlit1b_Add
  16235.   BGT     PerfBlit1bCheck5
  16236. PerfBlit1bSimpleReMap
  16237.   MOVE.w  CurrentChunkyTable1,d0
  16238.   !GetTableObjectPtr ; table base in a0
  16239.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0
  16240.   MOVEQ.l #0,d1
  16241.   MOVEQ.l #0,d2
  16242.   MOVEQ.l #4,d5
  16243. PerfBlit1bSimpleReMapYLoop
  16244.     MOVE.w  d3,d0 ; XLoop
  16245. PerfBlit1bSimpleReMapXLoop
  16246.       SUB.w   d5,a3
  16247.       TST.b   -(a4) ; Mask?
  16248.       BNE     PerfBlit1bSimpleReMapSkip1
  16249.       MOVE.b  3(a3),d1 ; Get dest
  16250.       MOVE.b  0(a0,d1.w),3(a3)
  16251. PerfBlit1bSimpleReMapSkip1
  16252.       TST.b   -(a4) ; Mask?
  16253.       BNE     PerfBlit1bSimpleReMapSkip2
  16254.       MOVE.b  2(a3),d2 ; Get dest
  16255.       MOVE.b  0(a0,d2.w),2(a3)
  16256. PerfBlit1bSimpleReMapSkip2
  16257.       TST.b   -(a4) ; Mask?
  16258.       BNE     PerfBlit1bSimpleReMapSkip3
  16259.       MOVE.b  1(a3),d1 ; Get dest
  16260.       MOVE.b  0(a0,d1.w),1(a3)
  16261. PerfBlit1bSimpleReMapSkip3
  16262.       TST.b   -(a4) ; Mask?
  16263.       BNE     PerfBlit1bSimpleReMapSkip4
  16264.       MOVE.b  (a3),d2 ; Get dest
  16265.       MOVE.b  0(a0,d2.w),(a3)
  16266. PerfBlit1bSimpleReMapSkip4
  16267.       DBRA    d0,PerfBlit1bSimpleReMapXLoop
  16268.     SUB.w d7,a3
  16269.     SUB.w d6,a4
  16270.     DBRA  d4,PerfBlit1bSimpleReMapYLoop
  16271.   RTS
  16272. PerfBlit1b_Add
  16273. PerfBlit1bAddYLoop
  16274.     MOVE.w  d3,d0 ; XLoop
  16275. PerfBlit1bAddXLoop
  16276.       MOVE.l  -(a2),d1 ; Get source data
  16277.       ADD.b   d1,-(a3) ; Add to dest
  16278.       LSR.w   #8,d1
  16279.       ADD.b   d1,-(a3) ; Add to dest
  16280.       SWAP    d1
  16281.       ADD.b   d1,-(a3) ; Add to dest
  16282.       LSR.w   #8,d1
  16283.       ADD.b   d1,-(a3) ; Add to dest
  16284.       DBRA    d0,PerfBlit1bAddXLoop
  16285.     SUB.w d6,a2
  16286.     SUB.w d7,a3
  16287.     DBRA  d4,PerfBlit1bAddYLoop
  16288.   RTS
  16289. PerfBlit1bCheck5
  16290.   ; Next check
  16291.   RTS
  16292.  
  16293. PerformBlit1_16
  16294. ;Do a `Blit' stencilled-blit, width should be multiple of 16. Addresses don't have to be aligned.
  16295. ;Copies data using stencil for cookie-cut, or straight copy if no source stencil
  16296. ;d0=BlitModeType
  16297. ;d3=Operation width
  16298. ;d4=Operation height
  16299. ;d6=Source linemodulo
  16300. ;d7=Dest linemodulo
  16301. ;a2=Source data address
  16302. ;a3=Dest data address
  16303. ;a4=Source stencil address
  16304. ;Trashes many
  16305.   LSR.w   #4,d3 ; Width/16 for groups of 4 longwords
  16306.   SUBQ.w  #1,d4 ; YLoopcounter
  16307.   SUBQ.w  #1,d3 ; XLoopcounter
  16308.   EXG.l   d0,a4 ; Get to data reg for test
  16309.   TST.l d0 ; Has cookie?
  16310.   BNE   PerfBlit1_16HasCookie
  16311. PerfBlit1_16NoCookieYLoop
  16312.     MOVE.w  d3,d0 ; XLoop
  16313. PerfBlit1_16NoCookieXLoop
  16314.       MOVE.l  (a2)+,(a3)+ ; Copy data
  16315.       MOVE.l  (a2)+,(a3)+ ; Copy data
  16316.       MOVE.l  (a2)+,(a3)+ ; Copy data
  16317.       MOVE.l  (a2)+,(a3)+ ; Copy data
  16318.       DBRA    d0,PerfBlit1_16NoCookieXLoop
  16319.     ADD.w d6,a2
  16320.     ADD.w d7,a3
  16321.     DBRA  d4,PerfBlit1_16NoCookieYLoop
  16322.   RTS
  16323. PerfBlit1_16HasCookie
  16324.   EXG.l   d0,a4 ; Restore
  16325.   CMP.b   #1,d0 ; What type of blit?
  16326.   BEQ     PerfBlit1_16_Erase
  16327.   BGT     PerfBlit1_16Check2
  16328.   MOVE.w  d3,a0
  16329. PerfBlit1_16CookieYLoop
  16330.     MOVE.w  a0,d0 ; XLoop
  16331. PerfBlit1_16CookieXLoop
  16332.       MOVE.l  (a3),d1 ; Get dest
  16333.       MOVE.l  4(a3),d2
  16334.       AND.l   (a4)+,d1 ; And mask
  16335.       MOVE.l  8(a3),d3
  16336.       OR.l    (a2)+,d1 ; Or data
  16337.       AND.l   (a4)+,d2
  16338.       MOVE.l  12(a3),d5
  16339.       OR.l    (a2)+,d2
  16340.       AND.l   (a4)+,d3
  16341.       AND.l   (a4)+,d5
  16342.       OR.l    (a2)+,d3
  16343.       OR.l    (a2)+,d5
  16344.       MOVE.l  d1,(a3)+ ; Output
  16345.       MOVE.l  d2,(a3)+
  16346.       MOVE.l  d3,(a3)+
  16347.       MOVE.l  d5,(a3)+
  16348.       DBRA    d0,PerfBlit1_16CookieXLoop
  16349.     ADD.w d6,a2
  16350.     ADD.w d6,a4
  16351.     ADD.w d7,a3
  16352.     DBRA  d4,PerfBlit1_16CookieYLoop
  16353.   RTS
  16354. PerfBlit1_16_Erase
  16355.   MOVE.w  d3,a0
  16356. PerfBlit1_16EraseYLoop
  16357.     MOVE.w  a0,d0 ; XLoop
  16358. PerfBlit1_16EraseXLoop
  16359.       MOVE.l  (a4)+,d1 ; Get mask
  16360.       MOVE.l  (a4)+,d2
  16361.       MOVE.l  (a4)+,d3
  16362.       MOVE.l  (a4)+,d5
  16363.       AND.l   d1,(a3)+ ; And mask with dest data
  16364.       AND.l   d2,(a3)+
  16365.       AND.l   d3,(a3)+
  16366.       AND.l   d5,(a3)+
  16367.       DBRA    d0,PerfBlit1_16EraseXLoop
  16368.     ADD.w d6,a4
  16369.     ADD.w d7,a3
  16370.     DBRA  d4,PerfBlit1_16EraseYLoop
  16371.   RTS
  16372. PerfBlit1_16Check2 ; Do more type tests
  16373.   CMP.b   #3,d0 ; What type of blit?
  16374.   BEQ     PerfBlit1_16Solid
  16375.   BGT     PerfBlit1_16Check3
  16376.   MOVE.w  d3,a0
  16377. PerfBlit1_16InvYLoop
  16378.     MOVE.w  a0,d0 ; XLoop
  16379. PerfBlit1_16InvXLoop
  16380.       MOVE.l  (a4)+,d1 ; Get mask
  16381.       MOVE.l  (a4)+,d2
  16382.       NOT.l   d1 ; Inverse mask for graphic
  16383.       MOVE.l  (a4)+,d3
  16384.       NOT.l   d2
  16385.       MOVE.l  (a4)+,d5
  16386.       NOT.l   d3
  16387.       EOR.l   d1,(a3)+ ; Xor mask with dest data
  16388.       NOT.l   d5
  16389.       EOR.l   d2,(a3)+
  16390.       EOR.l   d3,(a3)+
  16391.       EOR.l   d5,(a3)+
  16392.       DBRA    d0,PerfBlit1_16InvXLoop
  16393.     ADD.w d6,a4
  16394.     ADD.w d7,a3
  16395.     DBRA  d4,PerfBlit1_16InvYLoop
  16396.   RTS
  16397. PerfBlit1_16Solid
  16398.   MOVE.w  d3,a0
  16399. PerfBlit1_16SolidYLoop
  16400.     MOVE.w  a0,d0 ; XLoop
  16401. PerfBlit1_16SolidXLoop
  16402.       MOVE.l  (a4)+,d1 ; Get mask
  16403.       MOVE.l  (a4)+,d2
  16404.       NOT.l   d1 ; Inverse mask for graphic
  16405.       MOVE.l  (a4)+,d3
  16406.       NOT.l   d2
  16407.       MOVE.l  (a4)+,d5
  16408.       NOT.l   d3
  16409.       OR.l    d1,(a3)+ ; Or mask with dest data
  16410.       NOT.l   d5
  16411.       OR.l    d2,(a3)+
  16412.       OR.l    d3,(a3)+
  16413.       OR.l    d5,(a3)+
  16414.       DBRA    d0,PerfBlit1_16SolidXLoop
  16415.     ADD.w d6,a4
  16416.     ADD.w d7,a3
  16417.     DBRA  d4,PerfBlit1_16SolidYLoop
  16418.   RTS
  16419. PerfBlit1_16Check3 ; Do more type tests
  16420.   CMP.b   #5,d0 ; What type of blit?
  16421.   BEQ     PerfBlit1_16_ReMap
  16422.   BGT     PerfBlit1_16Check4
  16423.   MOVE.b  CurrentInk1,d5
  16424.   MOVE.b  d5,d1
  16425.   LSL.w   #8,d5
  16426.   MOVE.b  d1,d5
  16427.   MOVE.w  d5,d1
  16428.   SWAP    d5
  16429.   MOVE.w  d1,d5
  16430.   MOVEM.l a5/a6,-(a7) ; Store
  16431.   MOVE.w  d3,a5
  16432. PerfBlit1_16ColourYLoop
  16433.     MOVE.w  a5,d0 ; XLoop
  16434. PerfBlit1_16ColourXLoop
  16435.       MOVE.l  (a3),d3 ; Get dest
  16436.       MOVE.l  (a4)+,d1 ; Get mask
  16437.       MOVE.l  d5,d2 ; Copy colour
  16438.       AND.l   d1,d3 ; And with dest
  16439.       NOT.l   d1 ; Inverse mask
  16440.       MOVE.l  (a4)+,a0 ; Next mask
  16441.       AND.l   d1,d2 ; Make graphic
  16442.       MOVE.l  a0,d1 ; Get mask
  16443.       OR.l    d2,d3 ; Combine
  16444.       MOVE.l  d5,d2 ; Copy colour
  16445.       MOVE.l  d3,a0 ; Store Output
  16446.       MOVE.l  4(a3),d3 ; Get dest
  16447.       AND.l   d1,d3 ; And with dest
  16448.       MOVE.l  (a4)+,a1 ; Next mask
  16449.       NOT.l   d1 ; Inverse mask
  16450.       AND.l   d1,d2 ; Make graphic
  16451.       MOVE.l  a1,d1 ; Get mask
  16452.       OR.l    d2,d3 ; Combine
  16453.       MOVE.l  d5,d2 ; Copy colour
  16454.       MOVE.l  d3,a1 ; Store Output
  16455.       MOVE.l  8(a3),d3 ; Get dest
  16456.       AND.l   d1,d3 ; And with dest
  16457.       MOVE.l  (a4)+,a6 ; Next mask
  16458.       NOT.l   d1 ; Inverse mask
  16459.       AND.l   d1,d2 ; Make graphic
  16460.       MOVE.l  a6,d1 ; Get mask
  16461.       OR.l    d2,d3 ; Combine
  16462.       MOVE.l  d5,d2 ; Copy colour
  16463.       MOVE.l  d3,a6 ; StoreOutput
  16464.       MOVE.l  12(a3),d3 ; Get dest
  16465.       AND.l   d1,d3 ; And with dest
  16466.       NOT.l   d1 ; Inverse mask
  16467.       AND.l   d1,d2 ; Make graphic
  16468.       OR.l    d2,d3 ; Combine
  16469.       MOVE.l  a0,(a3)+ ; Output
  16470.       MOVE.l  a1,(a3)+ ; Output
  16471.       MOVE.l  a6,(a3)+ ; Output
  16472.       MOVE.l  d3,(a3)+ ; Output
  16473.       DBRA    d0,PerfBlit1_16ColourXLoop
  16474.     ADD.w   d6,a4
  16475.     ADD.w   d7,a3
  16476.     DBRA    d4,PerfBlit1_16ColourYLoop
  16477.   MOVEM.l  (a7)+,a5/a6 ; Restore
  16478.   RTS
  16479. PerfBlit1_16_ReMap
  16480.   MOVE.w  CurrentChunkyTable1,d0
  16481.   !GetTableObjectPtr ; table base in a0
  16482.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0
  16483.   MOVE.w  d3,a1
  16484.   MOVEQ.l #0,d1
  16485.   MOVEQ.l #0,d2
  16486.   MOVEQ.l #0,d3
  16487.   MOVEQ.l #0,d5
  16488. PerfBlit1_16ReMapYLoop
  16489.     MOVE.w  a1,d0 ; XLoop
  16490. PerfBlit1_16ReMapXLoop
  16491.       MOVE.b  (a2)+,d1 ; Get data
  16492.       MOVE.b  (a2)+,d2 ; Get data
  16493.       LSL.w   #8,d1
  16494.       MOVE.b  (a2)+,d3 ; Get data
  16495.       LSL.w   #8,d2
  16496.       MOVE.b  (a2)+,d5 ; Get data
  16497.       LSL.w   #8,d3
  16498.       MOVE.b  (a3),d1
  16499.       LSL.w   #8,d5
  16500.       MOVE.b  1(a3),d2
  16501.       MOVE.b  2(a3),d3
  16502.       MOVE.b  3(a3),d5
  16503.       MOVE.b  0(a0,d1.l),(a3)+
  16504.       MOVE.b  (a2)+,d1 ; Get data
  16505.       MOVE.b  0(a0,d2.l),(a3)+
  16506.       MOVE.b  (a2)+,d2 ; Get data
  16507.       MOVE.b  0(a0,d3.l),(a3)+
  16508.       LSL.w   #8,d1
  16509.       MOVE.b  0(a0,d5.l),(a3)+
  16510.       MOVE.b  (a2)+,d3 ; Get data
  16511.       LSL.w   #8,d2
  16512.       MOVE.b  (a2)+,d5 ; Get data
  16513.       LSL.w   #8,d3
  16514.       MOVE.b  (a3),d1
  16515.       LSL.w   #8,d5
  16516.       MOVE.b  1(a3),d2
  16517.       MOVE.b  2(a3),d3
  16518.       MOVE.b  3(a3),d5
  16519.       MOVE.b  0(a0,d1.l),(a3)+
  16520.       MOVE.b  (a2)+,d1 ; Get data
  16521.       MOVE.b  0(a0,d2.l),(a3)+
  16522.       MOVE.b  (a2)+,d2 ; Get data
  16523.       MOVE.b  0(a0,d3.l),(a3)+
  16524.       LSL.w   #8,d1
  16525.       MOVE.b  0(a0,d5.l),(a3)+
  16526.       MOVE.b  (a2)+,d3 ; Get data
  16527.       LSL.w   #8,d2
  16528.       MOVE.b  (a2)+,d5 ; Get data
  16529.       LSL.w   #8,d3
  16530.       MOVE.b  (a3),d1
  16531.       LSL.w   #8,d5
  16532.       MOVE.b  1(a3),d2
  16533.       MOVE.b  2(a3),d3
  16534.       MOVE.b  3(a3),d5
  16535.       MOVE.b  0(a0,d1.l),(a3)+
  16536.       MOVE.b  (a2)+,d1 ; Get data
  16537.       MOVE.b  0(a0,d2.l),(a3)+
  16538.       MOVE.b  (a2)+,d2 ; Get data
  16539.       MOVE.b  0(a0,d3.l),(a3)+
  16540.       LSL.w   #8,d1
  16541.       MOVE.b  0(a0,d5.l),(a3)+
  16542.       MOVE.b  (a2)+,d3 ; Get data
  16543.       LSL.w   #8,d2
  16544.       MOVE.b  (a2)+,d5 ; Get data
  16545.       LSL.w   #8,d3
  16546.       MOVE.b  (a3),d1
  16547.       LSL.w   #8,d5
  16548.       MOVE.b  0(a0,d1.l),(a3)+
  16549.       MOVE.b  (a3),d2
  16550.       MOVE.b  0(a0,d2.l),(a3)+
  16551.       MOVE.b  (a3),d3
  16552.       MOVE.b  0(a0,d3.l),(a3)+
  16553.       MOVE.b  (a3),d5
  16554.       MOVE.b  0(a0,d5.l),(a3)+
  16555.       DBRA    d0,PerfBlit1_16ReMapXLoop
  16556.     ADD.w d6,a2
  16557.     ADD.w d7,a3
  16558.     DBRA  d4,PerfBlit1_16ReMapYLoop
  16559.   RTS
  16560. PerfBlit1_16Check4
  16561.   CMP.b   #7,d0 ; What type of blit?
  16562.   BEQ     PerfBlit1_16_Add
  16563.   BGT     PerfBlit1_16Check5
  16564. PerfBlit1_16SimpleReMap
  16565.   MOVE.w  CurrentChunkyTable1,d0
  16566.   !GetTableObjectPtr ; table base in a0
  16567.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0
  16568.   MOVEQ.l #0,d1
  16569.   MOVEQ.l #0,d2
  16570.   MOVEQ.l #16,d5
  16571. PerfBlit1_16SimpleReMapYLoop
  16572.     MOVE.w  d3,d0 ; XLoop
  16573. PerfBlit1_16SimpleReMapXLoop
  16574.       CMP.l   #-1,(a4)
  16575.       BEQ     PerfBlit1_16SimpleReMapSkip4
  16576.       TST.b   (a4) ; Mask?
  16577.       BNE     PerfBlit1_16SimpleReMapSkip1
  16578.       MOVE.b  (a3),d1 ; Get dest
  16579.       MOVE.b  0(a0,d1.w),(a3)
  16580. PerfBlit1_16SimpleReMapSkip1
  16581.       TST.b   1(a4) ; Mask?
  16582.       BNE     PerfBlit1_16SimpleReMapSkip2
  16583.       MOVE.b  1(a3),d2 ; Get dest
  16584.       MOVE.b  0(a0,d2.w),1(a3)
  16585. PerfBlit1_16SimpleReMapSkip2
  16586.       TST.b   2(a4) ; Mask?
  16587.       BNE     PerfBlit1_16SimpleReMapSkip3
  16588.       MOVE.b  2(a3),d1 ; Get dest
  16589.       MOVE.b  0(a0,d1.w),2(a3)
  16590. PerfBlit1_16SimpleReMapSkip3
  16591.       TST.b   3(a4) ; Mask?
  16592.       BNE     PerfBlit1_16SimpleReMapSkip4
  16593.       MOVE.b  3(a3),d2 ; Get dest
  16594.       MOVE.b  0(a0,d2.w),3(a3)
  16595. PerfBlit1_16SimpleReMapSkip4
  16596.       CMP.l   #-1,4(a4)
  16597.       BEQ     PerfBlit1_16SimpleReMapSkip8
  16598.       TST.b   4(a4) ; Mask?
  16599.       BNE     PerfBlit1_16SimpleReMapSkip5
  16600.       MOVE.b  4(a3),d1 ; Get dest
  16601.       MOVE.b  0(a0,d1.w),4(a3)
  16602. PerfBlit1_16SimpleReMapSkip5
  16603.       TST.b   5(a4) ; Mask?
  16604.       BNE     PerfBlit1_16SimpleReMapSkip6
  16605.       MOVE.b  5(a3),d2 ; Get dest
  16606.       MOVE.b  0(a0,d2.w),5(a3)
  16607. PerfBlit1_16SimpleReMapSkip6
  16608.       TST.b   6(a4) ; Mask?
  16609.       BNE     PerfBlit1_16SimpleReMapSkip7
  16610.       MOVE.b  6(a3),d1 ; Get dest
  16611.       MOVE.b  0(a0,d1.w),6(a3)
  16612. PerfBlit1_16SimpleReMapSkip7
  16613.       TST.b   7(a4) ; Mask?
  16614.       BNE     PerfBlit1_16SimpleReMapSkip8
  16615.       MOVE.b  7(a3),d2 ; Get dest
  16616.       MOVE.b  0(a0,d2.w),7(a3)
  16617. PerfBlit1_16SimpleReMapSkip8
  16618.       CMP.l   #-1,8(a4)
  16619.       BEQ     PerfBlit1_16SimpleReMapSkip12
  16620.       TST.b   8(a4) ; Mask?
  16621.       BNE     PerfBlit1_16SimpleReMapSkip9
  16622.       MOVE.b  8(a3),d1 ; Get dest
  16623.       MOVE.b  0(a0,d1.w),8(a3)
  16624. PerfBlit1_16SimpleReMapSkip9
  16625.       TST.b   9(a4) ; Mask?
  16626.       BNE     PerfBlit1_16SimpleReMapSkip10
  16627.       MOVE.b  9(a3),d2 ; Get dest
  16628.       MOVE.b  0(a0,d2.w),9(a3)
  16629. PerfBlit1_16SimpleReMapSkip10
  16630.       TST.b   10(a4) ; Mask?
  16631.       BNE     PerfBlit1_16SimpleReMapSkip11
  16632.       MOVE.b  10(a3),d1 ; Get dest
  16633.       MOVE.b  0(a0,d1.w),10(a3)
  16634. PerfBlit1_16SimpleReMapSkip11
  16635.       TST.b   11(a4) ; Mask?
  16636.       BNE     PerfBlit1_16SimpleReMapSkip12
  16637.       MOVE.b  11(a3),d2 ; Get dest
  16638.       MOVE.b  0(a0,d2.w),11(a3)
  16639. PerfBlit1_16SimpleReMapSkip12
  16640.       CMP.l   #-1,12(a4)
  16641.       BEQ     PerfBlit1_16SimpleReMapSkip16
  16642.       TST.b   12(a4) ; Mask?
  16643.       BNE     PerfBlit1_16SimpleReMapSkip13
  16644.       MOVE.b  12(a3),d1 ; Get dest
  16645.       MOVE.b  0(a0,d1.w),12(a3)
  16646. PerfBlit1_16SimpleReMapSkip13
  16647.       TST.b   13(a4) ; Mask?
  16648.       BNE     PerfBlit1_16SimpleReMapSkip14
  16649.       MOVE.b  13(a3),d2 ; Get dest
  16650.       MOVE.b  0(a0,d2.w),13(a3)
  16651. PerfBlit1_16SimpleReMapSkip14
  16652.       TST.b   14(a4) ; Mask?
  16653.       BNE     PerfBlit1_16SimpleReMapSkip15
  16654.       MOVE.b  14(a3),d1 ; Get dest
  16655.       MOVE.b  0(a0,d1.w),14(a3)
  16656. PerfBlit1_16SimpleReMapSkip15
  16657.       TST.b   15(a4) ; Mask?
  16658.       BNE     PerfBlit1_16SimpleReMapSkip16
  16659.       MOVE.b  15(a3),d2 ; Get dest
  16660.       MOVE.b  0(a0,d2.w),15(a3)
  16661. PerfBlit1_16SimpleReMapSkip16
  16662.       ADD.w   d5,a4
  16663.       ADD.w   d5,a3
  16664.       DBRA    d0,PerfBlit1_16SimpleReMapXLoop
  16665.     ADD.w d7,a3
  16666.     ADD.w d6,a4
  16667.     DBRA  d4,PerfBlit1_16SimpleReMapYLoop
  16668.   RTS
  16669. PerfBlit1_16_Add
  16670.   MOVE.w  d3,a0
  16671. PerfBlit1_16AddYLoop
  16672.     MOVE.w  a0,d0 ; XLoop
  16673. PerfBlit1_16AddXLoop
  16674.       MOVE.l  (a2)+,d1 ; Get source data
  16675.       MOVE.l  (a2)+,d2 ; Get source data
  16676.       MOVE.l  (a2)+,d3 ; Get source data
  16677.       MOVE.l  (a2)+,d5 ; Get source data
  16678.       ADD.b   d1,3(a3) ; Add to dest
  16679.       LSR.w   #8,d1
  16680.       ADD.b   d1,2(a3) ; Add to dest
  16681.       SWAP    d1
  16682.       ADD.b   d1,1(a3) ; Add to dest
  16683.       LSR.w   #8,d1
  16684.       ADD.b   d1,(a3) ; Add to dest
  16685.       ADD.b   d2,7(a3) ; Add to dest
  16686.       LSR.w   #8,d2
  16687.       ADD.b   d2,6(a3) ; Add to dest
  16688.       SWAP    d2
  16689.       ADD.b   d2,5(a3) ; Add to dest
  16690.       LSR.w   #8,d2
  16691.       ADD.b   d2,4(a3) ; Add to dest
  16692.       ADD.b   d3,11(a3) ; Add to dest
  16693.       LSR.w   #8,d3
  16694.       ADD.b   d3,10(a3) ; Add to dest
  16695.       SWAP    d3
  16696.       ADD.b   d3,9(a3) ; Add to dest
  16697.       LSR.w   #8,d3
  16698.       ADD.b   d3,8(a3) ; Add to dest
  16699.       ADD.b   d5,15(a3) ; Add to dest
  16700.       LSR.w   #8,d5
  16701.       ADD.b   d5,14(a3) ; Add to dest
  16702.       SWAP    d5
  16703.       ADD.b   d5,13(a3) ; Add to dest
  16704.       LSR.w   #8,d5
  16705.       ADD.b   d5,12(a3) ; Add to dest
  16706.       ADD.l   #16,a3 ; Skip
  16707.       DBRA    d0,PerfBlit1_16AddXLoop
  16708.     ADD.w d6,a2
  16709.     ADD.w d7,a3
  16710.     DBRA  d4,PerfBlit1_16AddYLoop
  16711.   RTS
  16712. PerfBlit1_16Check5
  16713.   ; Next check
  16714.   RTS
  16715.  
  16716. PerformBlit1b_16
  16717. ;Do a `Blit' stencilled-blit, width should be multiple of 16, backwards. Addresses don't have to be aligned.
  16718. ;Copies data backwards using stencil for cookie-cut, or straight copy if no source stencil
  16719. ;d0=BlitModeType
  16720. ;d3=Operation width
  16721. ;d4=Operation height
  16722. ;d6=Source linemodulo
  16723. ;d7=Dest linemodulo
  16724. ;a2=Source data address
  16725. ;a3=Dest data address
  16726. ;a4=Source stencil address
  16727. ;Trashes many
  16728.   MOVE.w  d3,d5 ; Get Width
  16729.   ADD.w   d6,d5 ; Add source linemod
  16730.   MULU    d4,d5 ; Total bytes
  16731.   SUB.l   d6,d5 ; -Linemod of last line
  16732.   ADD.l   d5,a2 ; Add to source address
  16733.   ADD.l   d5,a4 ; Add to source stencil address
  16734.   MOVE.w  d3,d5 ; Get Width
  16735.   ADD.w   d7,d5 ; Add dest linemod
  16736.   MULU    d4,d5 ; Total bytes
  16737.   SUB.l   d7,d5 ; -Linemod of last line
  16738.   ADD.l   d5,a3 ; Add to dest address
  16739.   LSR.w   #4,d3 ; Width/16 for groups of 4 longwords
  16740.   SUBQ.w  #1,d4 ; YLoopcounter
  16741.   SUBQ.w  #1,d3 ; XLoopcounter
  16742.   EXG.l   d0,a4 ; Get to data reg for test
  16743.   TST.l d0 ; Has cookie?
  16744.   BNE   PerfBlit1b_16HasCookie
  16745. PerfBlit1b_16NoCookieYLoop
  16746.     MOVE.w  d3,d0 ; XLoop
  16747. PerfBlit1b_16NoCookieXLoop
  16748.       MOVE.l  -(a2),-(a3) ; Copy data
  16749.       MOVE.l  -(a2),-(a3) ; Copy data
  16750.       MOVE.l  -(a2),-(a3) ; Copy data
  16751.       MOVE.l  -(a2),-(a3) ; Copy data
  16752.       DBRA    d0,PerfBlit1b_16NoCookieXLoop
  16753.     ADD.w d6,a2
  16754.     ADD.w d7,a3
  16755.     DBRA  d4,PerfBlit1b_16NoCookieYLoop
  16756.   RTS
  16757. PerfBlit1b_16HasCookie
  16758.   EXG.l   d0,a4 ; Restore
  16759.   CMP.b   #1,d0 ; What type of blit?
  16760.   BEQ     PerfBlit1b_16_Erase
  16761.   BGT     PerfBlit1b_16Check2
  16762.   MOVE.w  d3,a0
  16763. PerfBlit1b_16CookieYLoop
  16764.     MOVE.w  a0,d0 ; XLoop
  16765. PerfBlit1b_16CookieXLoop
  16766.       MOVE.l  -(a3),d1 ; Get dest
  16767.       MOVE.l  -(a3),d2
  16768.       AND.l   -(a4),d1 ; And mask
  16769.       MOVE.l  -(a3),d3
  16770.       OR.l    -(a2),d1 ; Or data
  16771.       AND.l   -(a4),d2
  16772.       MOVE.l  -(a3),d5
  16773.       OR.l    -(a2),d2
  16774.       AND.l   -(a4),d3
  16775.       AND.l   -(a4),d5
  16776.       OR.l    -(a2),d3
  16777.       OR.l    -(a2),d5
  16778.       MOVE.l  d5,(a3) ; Output
  16779.       MOVE.l  d3,4(a3)
  16780.       MOVE.l  d2,8(a3)
  16781.       MOVE.l  d1,12(a3)
  16782.       DBRA    d0,PerfBlit1b_16CookieXLoop
  16783.     SUB.w d6,a2
  16784.     SUB.w d6,a4
  16785.     SUB.w d7,a3
  16786.     DBRA  d4,PerfBlit1b_16CookieYLoop
  16787.   RTS
  16788. PerfBlit1b_16_Erase
  16789.   MOVE.w  d3,a0
  16790. PerfBlit1b_16EraseYLoop
  16791.     MOVE.w  a0,d0 ; XLoop
  16792. PerfBlit1b_16EraseXLoop
  16793.       MOVE.l  -(a4),d1 ; Get mask
  16794.       MOVE.l  -(a4),d2
  16795.       MOVE.l  -(a4),d3
  16796.       MOVE.l  -(a4),d5
  16797.       AND.l   d1,-(a3) ; And mask with dest data
  16798.       AND.l   d2,-(a3)
  16799.       AND.l   d3,-(a3)
  16800.       AND.l   d5,-(a3)
  16801.       DBRA    d0,PerfBlit1b_16EraseXLoop
  16802.     SUB.w d6,a4
  16803.     SUB.w d7,a3
  16804.     DBRA  d4,PerfBlit1b_16EraseYLoop
  16805.   RTS
  16806. PerfBlit1b_16Check2 ; Do more type tests
  16807.   CMP.b   #3,d0 ; What type of blit?
  16808.   BEQ     PerfBlit1b_16Solid
  16809.   BGT     PerfBlit1b_16Check3
  16810.   MOVE.w  d3,a0
  16811. PerfBlit1b_16InvYLoop
  16812.     MOVE.w  a0,d0 ; XLoop
  16813. PerfBlit1b_16InvXLoop
  16814.       MOVE.l  -(a4),d1 ; Get mask
  16815.       MOVE.l  -(a4),d2
  16816.       NOT.l   d1 ; Inverse mask for graphic
  16817.       MOVE.l  -(a4),d3
  16818.       NOT.l   d2
  16819.       MOVE.l  -(a4),d5
  16820.       NOT.l   d3
  16821.       EOR.l   d1,-(a3) ; Xor mask with dest data
  16822.       NOT.l   d5
  16823.       EOR.l   d2,-(a3)
  16824.       EOR.l   d3,-(a3)
  16825.       EOR.l   d5,-(a3)
  16826.       DBRA    d0,PerfBlit1b_16InvXLoop
  16827.     SUB.w d6,a4
  16828.     SUB.w d7,a3
  16829.     DBRA  d4,PerfBlit1b_16InvYLoop
  16830.   RTS
  16831. PerfBlit1b_16Solid
  16832.   MOVE.w  d3,a0
  16833. PerfBlit1b_16SolidYLoop
  16834.     MOVE.w  a0,d0 ; XLoop
  16835. PerfBlit1b_16SolidXLoop
  16836.       MOVE.l  -(a4),d1 ; Get mask
  16837.       MOVE.l  -(a4),d2
  16838.       NOT.l   d1 ; Inverse mask for graphic
  16839.       MOVE.l  -(a4),d3
  16840.       NOT.l   d2
  16841.       MOVE.l  -(a4),d5
  16842.       NOT.l   d3
  16843.       OR.l    d1,-(a3) ; Or mask with dest data
  16844.       NOT.l   d5
  16845.       OR.l    d2,-(a3)
  16846.       OR.l    d3,-(a3)
  16847.       OR.l    d5,-(a3)
  16848.       DBRA    d0,PerfBlit1b_16SolidXLoop
  16849.     SUB.w d6,a4
  16850.     SUB.w d7,a3
  16851.     DBRA  d4,PerfBlit1b_16SolidYLoop
  16852.   RTS
  16853. PerfBlit1b_16Check3
  16854.   CMP.b   #5,d0 ; What type of blit?
  16855.   BEQ     PerfBlit1b_16_ReMap
  16856.   BGT     PerfBlit1b_16Check4
  16857.   MOVE.b  CurrentInk1,d5
  16858.   MOVE.b  d5,d1
  16859.   LSL.w   #8,d5
  16860.   MOVE.b  d1,d5
  16861.   MOVE.w  d5,d1
  16862.   SWAP    d5
  16863.   MOVE.w  d1,d5
  16864.   MOVE.l  a5,-(a7) ; Store
  16865.   MOVE.w  d3,a5
  16866. PerfBlit1b_16ColourYLoop
  16867.     MOVE.w  a5,d0 ; XLoop
  16868. PerfBlit1b_16ColourXLoop
  16869.       MOVE.l  -(a3),d3 ; Get dest
  16870.       MOVE.l  -(a4),d1 ; Get mask
  16871.       MOVE.l  d5,d2 ; Copy colour
  16872.       AND.l   d1,d3 ; And with dest
  16873.       NOT.l   d1 ; Inverse mask
  16874.       MOVE.l  -(a4),a0 ; Next mask
  16875.       AND.l   d1,d2 ; Make graphic
  16876.       MOVE.l  a0,d1 ; Get mask
  16877.       OR.l    d2,d3 ; Combine
  16878.       MOVE.l  d5,d2 ; Copy colour
  16879.       MOVE.l  d3,a0 ; Store Output
  16880.       MOVE.l  -(a3),d3 ; Get dest
  16881.       AND.l   d1,d3 ; And with dest
  16882.       MOVE.l  -(a4),a1 ; Next mask
  16883.       NOT.l   d1 ; Inverse mask
  16884.       AND.l   d1,d2 ; Make graphic
  16885.       MOVE.l  a1,d1 ; Get mask
  16886.       OR.l    d2,d3 ; Combine
  16887.       MOVE.l  d5,d2 ; Copy colour
  16888.       MOVE.l  d3,a1 ; Store Output
  16889.       MOVE.l  -(a3),d3 ; Get dest
  16890.       AND.l   d1,d3 ; And with dest
  16891.       MOVE.l  -(a4),a6 ; Next mask
  16892.       NOT.l   d1 ; Inverse mask
  16893.       AND.l   d1,d2 ; Make graphic
  16894.       MOVE.l  a6,d1 ; Get mask
  16895.       OR.l    d2,d3 ; Combine
  16896.       MOVE.l  d5,d2 ; Copy colour
  16897.       MOVE.l  d3,a6 ; StoreOutput
  16898.       MOVE.l  -(a3),d3 ; Get dest
  16899.       AND.l   d1,d3 ; And with dest
  16900.       NOT.l   d1 ; Inverse mask
  16901.       AND.l   d1,d2 ; Make graphic
  16902.       OR.l    d2,d3 ; Combine
  16903.       MOVE.l  d3,(a3) ; Output
  16904.       MOVE.l  a6,4(a3) ; Output
  16905.       MOVE.l  a1,8(a3) ; Output
  16906.       MOVE.l  a0,12(a3) ; Output
  16907.       DBRA    d0,PerfBlit1b_16ColourXLoop
  16908.     SUB.w   d6,a4
  16909.     SUB.w   d7,a3
  16910.     DBRA    d4,PerfBlit1b_16ColourYLoop
  16911.   MOVE.l  (a7)+,a5 ; Restore
  16912.   RTS
  16913. PerfBlit1b_16_ReMap
  16914.   MOVE.w  CurrentChunkyTable1,d0
  16915.   !GetTableObjectPtr ; table base in a0
  16916.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0
  16917.   MOVE.w  d3,a1
  16918.   MOVEQ.l #0,d1
  16919.   MOVEQ.l #0,d2
  16920.   MOVEQ.l #0,d3
  16921.   MOVEQ.l #0,d5
  16922. PerfBlit1b_16ReMapYLoop
  16923.     MOVE.w  a1,d0 ; XLoop
  16924. PerfBlit1b_16ReMapXLoop
  16925.       MOVE.b  -(a2),d1 ; Get data
  16926.       MOVE.b  -(a2),d2 ; Get data
  16927.       LSL.w   #8,d1
  16928.       MOVE.b  -(a2),d3 ; Get data
  16929.       LSL.w   #8,d2
  16930.       MOVE.b  -(a2),d5 ; Get data
  16931.       LSL.w   #8,d3
  16932.       MOVE.b  -(a3),d1
  16933.       LSL.w   #8,d5
  16934.       MOVE.b  -(a3),d2
  16935.       MOVE.b  -(a3),d3
  16936.       MOVE.b  -(a3),d5
  16937.       MOVE.b  0(a0,d1.l),3(a3)
  16938.       MOVE.b  -(a2),d1 ; Get data
  16939.       MOVE.b  0(a0,d2.l),2(a3)
  16940.       MOVE.b  -(a2),d2 ; Get data
  16941.       MOVE.b  0(a0,d3.l),1(a3)
  16942.       LSL.w   #8,d1
  16943.       MOVE.b  0(a0,d5.l),(a3)
  16944.       MOVE.b  -(a2),d3 ; Get data
  16945.       LSL.w   #8,d2
  16946.       MOVE.b  -(a2),d5 ; Get data
  16947.       LSL.w   #8,d3
  16948.       MOVE.b  -(a3),d1
  16949.       LSL.w   #8,d5
  16950.       MOVE.b  -(a3),d2
  16951.       MOVE.b  -(a3),d3
  16952.       MOVE.b  -(a3),d5
  16953.       MOVE.b  0(a0,d1.l),3(a3)
  16954.       MOVE.b  -(a2),d1 ; Get data
  16955.       MOVE.b  0(a0,d2.l),2(a3)
  16956.       MOVE.b  -(a2),d2 ; Get data
  16957.       MOVE.b  0(a0,d3.l),1(a3)
  16958.       LSL.w   #8,d1
  16959.       MOVE.b  0(a0,d5.l),(a3)
  16960.       MOVE.b  -(a2),d3 ; Get data
  16961.       LSL.w   #8,d2
  16962.       MOVE.b  -(a2),d5 ; Get data
  16963.       LSL.w   #8,d3
  16964.       MOVE.b  -(a3),d1
  16965.       LSL.w   #8,d5
  16966.       MOVE.b  -(a3),d2
  16967.       MOVE.b  -(a3),d3
  16968.       MOVE.b  -(a3),d5
  16969.       MOVE.b  0(a0,d1.l),3(a3)
  16970.       MOVE.b  -(a2),d1 ; Get data
  16971.       MOVE.b  0(a0,d2.l),2(a3)
  16972.       MOVE.b  -(a2),d2 ; Get data
  16973.       MOVE.b  0(a0,d3.l),1(a3)
  16974.       LSL.w   #8,d1
  16975.       MOVE.b  0(a0,d5.l),(a3)
  16976.       MOVE.b  -(a2),d3 ; Get data
  16977.       LSL.w   #8,d2
  16978.       MOVE.b  -(a2),d5 ; Get data
  16979.       LSL.w   #8,d3
  16980.       MOVE.b  -(a3),d1
  16981.       LSL.w   #8,d5
  16982.       MOVE.b  0(a0,d1.l),(a3)
  16983.       MOVE.b  -(a3),d2
  16984.       MOVE.b  0(a0,d2.l),(a3)
  16985.       MOVE.b  -(a3),d3
  16986.       MOVE.b  0(a0,d3.l),(a3)
  16987.       MOVE.b  -(a3),d5
  16988.       MOVE.b  0(a0,d5.l),(a3)
  16989.       DBRA    d0,PerfBlit1b_16ReMapXLoop
  16990.     SUB.w d6,a2
  16991.     SUB.w d7,a3
  16992.     DBRA  d4,PerfBlit1b_16ReMapYLoop
  16993.   RTS
  16994. PerfBlit1b_16Check4
  16995.   CMP.b   #7,d0 ; What type of blit?
  16996.   BEQ     PerfBlit1b_16_Add
  16997.   BGT     PerfBlit1b_16Check5
  16998. PerfBlit1b_16SimpleReMap
  16999.   MOVE.w  CurrentChunkyTable1,d0
  17000.   !GetTableObjectPtr ; table base in a0
  17001.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0
  17002.   MOVEQ.l #0,d1
  17003.   MOVEQ.l #0,d2
  17004.   MOVEQ.l #16,d5
  17005. PerfBlit1b_16SimpleReMapYLoop
  17006.     MOVE.w  d3,d0 ; XLoop
  17007. PerfBlit1b_16SimpleReMapXLoop
  17008.       SUB.w   d5,a4
  17009.       SUB.w   d5,a3
  17010.       CMP.l   #-1,12(a4)
  17011.       BEQ     PerfBlit1b_16SimpleReMapSkip4
  17012.       TST.b   15(a4) ; Mask?
  17013.       BNE     PerfBlit1b_16SimpleReMapSkip1
  17014.       MOVE.b  15(a3),d1 ; Get dest
  17015.       MOVE.b  0(a0,d1.w),15(a3)
  17016. PerfBlit1b_16SimpleReMapSkip1
  17017.       TST.b   14(a4) ; Mask?
  17018.       BNE     PerfBlit1b_16SimpleReMapSkip2
  17019.       MOVE.b  14(a3),d2 ; Get dest
  17020.       MOVE.b  0(a0,d2.w),14(a3)
  17021. PerfBlit1b_16SimpleReMapSkip2
  17022.       TST.b   13(a4) ; Mask?
  17023.       BNE     PerfBlit1b_16SimpleReMapSkip3
  17024.       MOVE.b  13(a3),d1 ; Get dest
  17025.       MOVE.b  0(a0,d1.w),13(a3)
  17026. PerfBlit1b_16SimpleReMapSkip3
  17027.       TST.b   12(a4) ; Mask?
  17028.       BNE     PerfBlit1b_16SimpleReMapSkip4
  17029.       MOVE.b  12(a3),d2 ; Get dest
  17030.       MOVE.b  0(a0,d2.w),12(a3)
  17031. PerfBlit1b_16SimpleReMapSkip4
  17032.       CMP.l   #-1,8(a4)
  17033.       BEQ     PerfBlit1b_16SimpleReMapSkip8
  17034.       TST.b   11(a4) ; Mask?
  17035.       BNE     PerfBlit1b_16SimpleReMapSkip5
  17036.       MOVE.b  11(a3),d1 ; Get dest
  17037.       MOVE.b  0(a0,d1.w),11(a3)
  17038. PerfBlit1b_16SimpleReMapSkip5
  17039.       TST.b   10(a4) ; Mask?
  17040.       BNE     PerfBlit1b_16SimpleReMapSkip6
  17041.       MOVE.b  10(a3),d2 ; Get dest
  17042.       MOVE.b  0(a0,d2.w),10(a3)
  17043. PerfBlit1b_16SimpleReMapSkip6
  17044.       TST.b   9(a4) ; Mask?
  17045.       BNE     PerfBlit1b_16SimpleReMapSkip7
  17046.       MOVE.b  9(a3),d1 ; Get dest
  17047.       MOVE.b  0(a0,d1.w),9(a3)
  17048. PerfBlit1b_16SimpleReMapSkip7
  17049.       TST.b   8(a4) ; Mask?
  17050.       BNE     PerfBlit1b_16SimpleReMapSkip8
  17051.       MOVE.b  8(a3),d2 ; Get dest
  17052.       MOVE.b  0(a0,d2.w),8(a3)
  17053. PerfBlit1b_16SimpleReMapSkip8
  17054.       CMP.l   #-1,4(a4)
  17055.       BEQ     PerfBlit1b_16SimpleReMapSkip12
  17056.       TST.b   7(a4) ; Mask?
  17057.       BNE     PerfBlit1b_16SimpleReMapSkip9
  17058.       MOVE.b  7(a3),d1 ; Get dest
  17059.       MOVE.b  0(a0,d1.w),7(a3)
  17060. PerfBlit1b_16SimpleReMapSkip9
  17061.       TST.b   6(a4) ; Mask?
  17062.       BNE     PerfBlit1b_16SimpleReMapSkip10
  17063.       MOVE.b  6(a3),d2 ; Get dest
  17064.       MOVE.b  0(a0,d2.w),6(a3)
  17065. PerfBlit1b_16SimpleReMapSkip10
  17066.       TST.b   5(a4) ; Mask?
  17067.       BNE     PerfBlit1b_16SimpleReMapSkip11
  17068.       MOVE.b  5(a3),d1 ; Get dest
  17069.       MOVE.b  0(a0,d1.w),5(a3)
  17070. PerfBlit1b_16SimpleReMapSkip11
  17071.       TST.b   4(a4) ; Mask?
  17072.       BNE     PerfBlit1b_16SimpleReMapSkip12
  17073.       MOVE.b  4(a3),d2 ; Get dest
  17074.       MOVE.b  0(a0,d2.w),4(a3)
  17075. PerfBlit1b_16SimpleReMapSkip12
  17076.       CMP.l   #-1,(a4)
  17077.       BEQ     PerfBlit1b_16SimpleReMapSkip16
  17078.       TST.b   3(a4) ; Mask?
  17079.       BNE     PerfBlit1b_16SimpleReMapSkip13
  17080.       MOVE.b  3(a3),d1 ; Get dest
  17081.       MOVE.b  0(a0,d1.w),3(a3)
  17082. PerfBlit1b_16SimpleReMapSkip13
  17083.       TST.b   2(a4) ; Mask?
  17084.       BNE     PerfBlit1b_16SimpleReMapSkip14
  17085.       MOVE.b  2(a3),d2 ; Get dest
  17086.       MOVE.b  0(a0,d2.w),2(a3)
  17087. PerfBlit1b_16SimpleReMapSkip14
  17088.       TST.b   1(a4) ; Mask?
  17089.       BNE     PerfBlit1b_16SimpleReMapSkip15
  17090.       MOVE.b  1(a3),d1 ; Get dest
  17091.       MOVE.b  0(a0,d1.w),1(a3)
  17092. PerfBlit1b_16SimpleReMapSkip15
  17093.       TST.b   (a4) ; Mask?
  17094.       BNE     PerfBlit1b_16SimpleReMapSkip16
  17095.       MOVE.b  (a3),d2 ; Get dest
  17096.       MOVE.b  0(a0,d2.w),(a3)
  17097. PerfBlit1b_16SimpleReMapSkip16
  17098.       DBRA    d0,PerfBlit1b_16SimpleReMapXLoop
  17099.     SUB.w d7,a3
  17100.     SUB.w d6,a4
  17101.     DBRA  d4,PerfBlit1b_16SimpleReMapYLoop
  17102.   RTS
  17103. PerfBlit1b_16_Add
  17104.   MOVE.w  d3,a0
  17105. PerfBlit1b_16AddYLoop
  17106.     MOVE.w  a0,d0 ; XLoop
  17107. PerfBlit1b_16AddXLoop
  17108.       MOVE.l  -(a2),d1 ; Get source data
  17109.       MOVE.l  -(a2),d2 ; Get source data
  17110.       MOVE.l  -(a2),d3 ; Get source data
  17111.       MOVE.l  -(a2),d5 ; Get source data
  17112.       ADD.b   d1,-(a3) ; Add to dest
  17113.       LSR.w   #8,d1
  17114.       ADD.b   d1,-(a3) ; Add to dest
  17115.       SWAP    d1
  17116.       ADD.b   d1,-(a3) ; Add to dest
  17117.       LSR.w   #8,d1
  17118.       ADD.b   d1,-(a3) ; Add to dest
  17119.       ADD.b   d2,-(a3) ; Add to dest
  17120.       LSR.w   #8,d2
  17121.       ADD.b   d2,-(a3) ; Add to dest
  17122.       SWAP    d2
  17123.       ADD.b   d2,-(a3) ; Add to dest
  17124.       LSR.w   #8,d2
  17125.       ADD.b   d2,-(a3) ; Add to dest
  17126.       ADD.b   d3,-(a3) ; Add to dest
  17127.       LSR.w   #8,d3
  17128.       ADD.b   d3,-(a3) ; Add to dest
  17129.       SWAP    d3
  17130.       ADD.b   d3,-(a3) ; Add to dest
  17131.       LSR.w   #8,d3
  17132.       ADD.b   d3,-(a3) ; Add to dest
  17133.       ADD.b   d5,-(a3) ; Add to dest
  17134.       LSR.w   #8,d5
  17135.       ADD.b   d5,-(a3) ; Add to dest
  17136.       SWAP    d5
  17137.       ADD.b   d5,-(a3) ; Add to dest
  17138.       LSR.w   #8,d5
  17139.       ADD.b   d5,-(a3) ; Add to dest
  17140.       DBRA    d0,PerfBlit1b_16AddXLoop
  17141.     ADD.w d6,a2
  17142.     ADD.w d7,a3
  17143.     DBRA  d4,PerfBlit1b_16AddYLoop
  17144.   RTS
  17145. PerfBlit1b_16Check5
  17146.   ; Next check
  17147.   RTS
  17148.  
  17149. PerformBlit2
  17150. ;Do a `Blit' stencilled-blit, width should be multiple of 4
  17151. ;Copies data using stencil for cookie-cut, does same with cookie to stencil
  17152. ;d0=BlitModeType
  17153. ;d3=Operation width
  17154. ;d4=Operation height
  17155. ;d6=Source linemodulo
  17156. ;d7=Dest linemodulo
  17157. ;a2=Source data address
  17158. ;a3=Dest data address
  17159. ;a4=Source stencil address
  17160. ;a5=Dest stencil address
  17161. ;Trashes many
  17162.   MOVE.b  d3,d5 ; Copy Width
  17163.   AND.b   #$0F,d5 ; Width multiple of 16?
  17164.   BEQ     PerformBlit2_16
  17165.   LSR.w   #2,d3 ; Width/4 for longwords
  17166.   SUBQ.w  #1,d3 ; XLoopcounter
  17167.   SUBQ.w  #1,d4 ; YLoopcounter
  17168.   CMP.b   #1,d0 ; What type of blit?
  17169.   BEQ     PerfBlit2EraseYLoop
  17170.   BGT     PerfBlit2Check2
  17171. PerfBlit2CookieYLoop
  17172.     MOVE.w  d3,d0 ; XLoop
  17173. PerfBlit2CookieXLoop
  17174.       MOVE.l  (a3),d5 ; Get dest
  17175.       MOVE.l  (a4)+,d1 ; Get mask
  17176.       AND.l   d1,d5 ; And data
  17177.       OR.l    (a2)+,d5 ; Get data
  17178.       AND.l   d1,(a5)+ ; Output stencil
  17179.       MOVE.l  d5,(a3)+ ; Output data
  17180.       DBRA    d0,PerfBlit2CookieXLoop
  17181.     ADD.w d6,a2
  17182.     ADD.w d6,a4
  17183.     ADD.w d7,a3
  17184.     ADD.w d7,a5
  17185.     DBRA  d4,PerfBlit2CookieYLoop
  17186.   RTS
  17187. PerfBlit2EraseYLoop
  17188.     MOVE.w  d3,d0 ; XLoop
  17189. PerfBlit2EraseXLoop
  17190.       MOVE.l  (a4)+,d5 ; Get mask
  17191.       AND.l   d5,(a3)+ ; And mask with dest data
  17192.       OR.l    d5,(a5)+ ; And mask with dest stencil
  17193.       DBRA    d0,PerfBlit2EraseXLoop
  17194.     ADD.w d6,a4
  17195.     ADD.w d7,a3
  17196.     ADD.w d7,a5
  17197.     DBRA  d4,PerfBlit2EraseYLoop
  17198.   RTS
  17199. PerfBlit2Check2 ; Do more type tests
  17200.   CMP.b   #3,d0 ; What type of blit?
  17201.   BEQ     PerfBlit2SolidYLoop
  17202.   BGT     PerfBlit2Check3
  17203. PerfBlit2InvYLoop
  17204.     MOVE.w  d3,d0 ; XLoop
  17205. PerfBlit2InvXLoop
  17206.       MOVE.l  (a4)+,d5 ; Get mask
  17207.       NOT.l   d5 ; Inverse mask for graphic
  17208.       EOR.l   d5,(a3)+ ; Xor mask with dest data
  17209.       EOR.l   d5,(a5)+ ; Xor mask with dest stencil
  17210.       DBRA    d0,PerfBlit2InvXLoop
  17211.     ADD.w d6,a4
  17212.     ADD.w d7,a3
  17213.     ADD.w d7,a5
  17214.     DBRA  d4,PerfBlit2InvYLoop
  17215.   RTS
  17216. PerfBlit2SolidYLoop
  17217.     MOVE.w  d3,d0 ; XLoop
  17218. PerfBlit2SolidXLoop
  17219.       MOVE.l  (a4)+,d5 ; Get mask
  17220.       AND.l   d5,(a5)+ ; Or mask with dest stencil
  17221.       NOT.l   d5 ; Inverse mask for graphic
  17222.       OR.l    d5,(a3)+ ; Or mask with dest data
  17223.       DBRA    d0,PerfBlit2SolidXLoop
  17224.     ADD.w d6,a4
  17225.     ADD.w d7,a3
  17226.     ADD.w d7,a5
  17227.     DBRA  d4,PerfBlit2SolidYLoop
  17228.   RTS
  17229. PerfBlit2Check3
  17230.   CMP.b   #5,d0 ; What type of blit?
  17231.   BEQ     PerfBlit2Re_Map
  17232.   BGT     PerfBlit2Check4
  17233.   MOVE.b  CurrentInk1,d5
  17234.   MOVE.b  d5,d1
  17235.   LSL.w   #8,d5
  17236.   MOVE.b  d1,d5
  17237.   MOVE.w  d5,d1
  17238.   SWAP    d5
  17239.   MOVE.w  d1,d5
  17240.   MOVE.l  a6,-(a7) ; Store
  17241.   MOVE.w  d3,a6
  17242. PerfBlit2ColourYLoop
  17243.     MOVE.w  a6,d0 ; XLoop
  17244. PerfBlit2ColourXLoop
  17245.       MOVE.l  (a3),d3 ; Get dest
  17246.       MOVE.l  d5,d2 ; Copy colour
  17247.       MOVE.l  (a4)+,d1 ; Get mask
  17248.       AND.l   d1,d3 ; And with dest
  17249.       AND.l    d1,(a5)+ ; Write mask
  17250.       NOT.l   d1 ; Inverse mask
  17251.       AND.l   d1,d2 ; Make graphic
  17252.       OR.l    d2,d3 ; Combine
  17253.       MOVE.l  d3,(a3)+ ; Output
  17254.       DBRA    d0,PerfBlit2ColourXLoop
  17255.     ADD.w   d6,a4
  17256.     ADD.w   d7,a3
  17257.     ADD.w   d7,a5
  17258.     DBRA    d4,PerfBlit2ColourYLoop
  17259.   MOVE.l  (a7)+,a6 ; Restore
  17260.   RTS
  17261. PerfBlit2Re_Map
  17262.   MOVE.w  CurrentChunkyTable1,d0
  17263.   !GetTableObjectPtr ; table base in a0
  17264.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0
  17265.   MOVE.w  d3,a1
  17266.   MOVEQ.l #0,d1
  17267.   MOVEQ.l #0,d2
  17268.   MOVEQ.l #0,d3
  17269.   MOVEQ.l #0,d5
  17270. PerfBlit2ReMapYLoop
  17271.     MOVE.w  a1,d0 ; XLoop
  17272. PerfBlit2ReMapXLoop
  17273.       MOVE.b  (a2)+,d1 ; Get data
  17274.       MOVE.b  (a2)+,d2 ; Get data
  17275.       LSL.w   #8,d1
  17276.       MOVE.b  (a2)+,d3 ; Get data
  17277.       LSL.w   #8,d2
  17278.       MOVE.b  (a2)+,d5 ; Get data
  17279.       LSL.w   #8,d3
  17280.       MOVE.b  (a3),d1
  17281.       LSL.w   #8,d5
  17282.       MOVE.b  1(a3),d2
  17283.       MOVE.b  2(a3),d3
  17284.       MOVE.b  3(a3),d5
  17285.       SUBQ.w  #1,d0
  17286.       BLT     PerfBlit2ReMapXSkip
  17287. PerfBlit2ReMapXXLoop
  17288.       MOVE.b  0(a0,d1.l),(a3)+ ; Write
  17289.       MOVE.b  (a2)+,d1 ; Get data
  17290.       MOVE.b  0(a0,d2.l),(a3)+ ; Write
  17291.       MOVE.b  (a2)+,d2 ; Get data
  17292.       MOVE.b  0(a0,d3.l),(a3)+ ; Write
  17293.       LSL.w   #8,d1
  17294.       MOVE.b  0(a0,d5.l),(a3)+ ; Write
  17295.       MOVE.l  (a4)+,d5 ; Get cookie
  17296.       MOVE.b  (a2)+,d3 ; Get data
  17297.       OR.l    d5,(a5)+ ; Write stencil
  17298.       MOVEQ.l #0,d5 ; init
  17299.       LSL.w   #8,d2
  17300.       MOVE.b  (a2)+,d5 ; Get data
  17301.       LSL.w   #8,d3
  17302.       MOVE.b  (a3),d1
  17303.       LSL.w   #8,d5
  17304.       MOVE.b  1(a3),d2
  17305.       MOVE.b  2(a3),d3
  17306.       MOVE.b  3(a3),d5
  17307.       DBRA    d0,PerfBlit2ReMapXXLoop
  17308. PerfBlit2ReMapXSkip
  17309.     MOVE.b  0(a0,d1.l),(a3)+ ; Write
  17310.     MOVE.b  0(a0,d2.l),(a3)+
  17311.     ADD.w d6,a2
  17312.     MOVE.b  0(a0,d3.l),(a3)+
  17313.     MOVE.b  0(a0,d5.l),(a3)+
  17314.     MOVE.l  (a4)+,d3 ; Get cookie
  17315.     ADD.w d7,a3
  17316.     OR.l    d3,(a5)+ ; Write stencil
  17317.     ADD.w d6,a4
  17318.     MOVEQ.l #0,d3 ; init
  17319.     ADD.w d7,a5
  17320.     DBRA  d4,PerfBlit2ReMapYLoop
  17321.   RTS
  17322. PerfBlit2Check4
  17323.   CMP.b   #7,d0 ; What type of blit?
  17324.   BEQ     PerfBlit2_Add
  17325.   BGT     PerfBlit2Check5
  17326. PerfBlit2SimpleReMap
  17327.   MOVE.w  CurrentChunkyTable1,d0
  17328.   !GetTableObjectPtr ; table base in a0
  17329.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0
  17330.   MOVE.w  d3,a1
  17331.   MOVEQ.l #0,d1
  17332.   MOVEQ.l #0,d2
  17333.   MOVEQ.l #4,d3
  17334. PerfBlit2SimpleReMapYLoop
  17335.     MOVE.w  a1,d0 ; XLoop
  17336. PerfBlit2SimpleReMapXLoop
  17337.       TST.b   (a4) ; Mask?
  17338.       BNE     PerfBlit2SimpleReMapSkip1
  17339.       MOVE.b  (a3),d1 ; Get dest
  17340.       MOVE.b  0(a0,d1.w),(a3)
  17341. PerfBlit2SimpleReMapSkip1
  17342.       TST.b   1(a4) ; Mask?
  17343.       BNE     PerfBlit2SimpleReMapSkip2
  17344.       MOVE.b  1(a3),d2 ; Get dest
  17345.       MOVE.b  0(a0,d2.w),1(a3)
  17346. PerfBlit2SimpleReMapSkip2
  17347.       TST.b   2(a4) ; Mask?
  17348.       BNE     PerfBlit2SimpleReMapSkip3
  17349.       MOVE.b  2(a3),d1 ; Get dest
  17350.       MOVE.b  0(a0,d1.w),2(a3)
  17351. PerfBlit2SimpleReMapSkip3
  17352.       TST.b   3(a4) ; Mask?
  17353.       BNE     PerfBlit2SimpleReMapSkip4
  17354.       MOVE.b  3(a3),d2 ; Get dest
  17355.       MOVE.b  0(a0,d2.w),3(a3)
  17356. PerfBlit2SimpleReMapSkip4
  17357.       MOVE.l  (a4)+,d5
  17358.       ADD.w   d3,a3
  17359.       OR.l    d5,(a5)+
  17360.       DBRA    d0,PerfBlit2SimpleReMapXLoop
  17361.     ADD.w d7,a3
  17362.     ADD.w d6,a4
  17363.     ADD.w d7,a5
  17364.     DBRA  d4,PerfBlit2SimpleReMapYLoop
  17365.   RTS
  17366. PerfBlit2_Add
  17367.   MOVEQ.l #4,d5 ; Skip value
  17368. PerfBlit2AddYLoop
  17369.     MOVE.w  d3,d0 ; XLoop
  17370. PerfBlit2AddXLoop
  17371.       MOVE.l  (a2)+,d1 ; Get source data
  17372.       MOVE.l  (a4)+,d2 ; Get source stencil
  17373.       ADD.b   d1,3(a3) ; Add to dest
  17374.       LSR.w   #8,d1
  17375.       ADD.b   d1,2(a3) ; Add to dest
  17376.       SWAP    d1
  17377.       ADD.b   d1,1(a3) ; Add to dest
  17378.       LSR.w   #8,d1
  17379.       ADD.b   d1,(a3) ; Add to dest
  17380.       AND.l   d2,(a5)+ ; Write stencil
  17381.       ADD.l   d5,a3 ; Skip
  17382.       DBRA    d0,PerfBlit2AddXLoop
  17383.     ADD.w d6,a2
  17384.     ADD.w d6,a4
  17385.     ADD.w d7,a3
  17386.     ADD.w d7,a5
  17387.     DBRA  d4,PerfBlit2AddYLoop
  17388.   RTS
  17389. PerfBlit2Check5
  17390.   ; Next check
  17391.   RTS
  17392.  
  17393. PerformBlit2b
  17394. ;Do a `Blit' stencilled-blit, width should be multiple of 4, backwards
  17395. ;Copies data backwards using stencil for cookie-cut, does same with cookie to stencil
  17396. ;d0=BlitModeType
  17397. ;d3=Operation width
  17398. ;d4=Operation height
  17399. ;d6=Source linemodulo
  17400. ;d7=Dest linemodulo
  17401. ;a2=Source data address
  17402. ;a3=Dest data address
  17403. ;a4=Source stencil address
  17404. ;a5=Dest stencil address
  17405. ;Trashes many
  17406.   MOVE.b  d3,d5 ; Copy Width
  17407.   AND.b   #$0F,d5 ; Width multiple of 16?
  17408.   BEQ     PerformBlit2b_16
  17409.   MOVE.w  d3,d5 ; Copy width
  17410.   ADD.w   d6,d5 ; Add source linemod
  17411.   MULU    d4,d5 ; Total bytes
  17412.   SUB.l   d6,d5 ; -Linemod of last line
  17413.   ADD.l   d5,a2 ; Add to source address
  17414.   ADD.l   d5,a4 ; Add to source stencil address
  17415.   MOVE.w  d3,d5 ; Get Width
  17416.   ADD.w   d7,d5 ; Add dest linemod
  17417.   MULU    d4,d5 ; Total bytes
  17418.   SUB.l   d7,d5 ; -Linemod of last line
  17419.   ADD.l   d5,a3 ; Add to dest address
  17420.   ADD.l   d5,a5 ; Add to dest stencil address
  17421.   LSR.w   #2,d3 ; Width/4 for longwords
  17422.   SUBQ.w  #1,d3 ; XLoopcounter
  17423.   SUBQ.w  #1,d4 ; YLoopcounter
  17424.   CMP.b   #1,d0 ; What type of blit?
  17425.   BEQ     PerfBlit2bEraseYLoop
  17426.   BGT     PerfBlit2bCheck2
  17427. PerfBlit2bCookieYLoop
  17428.     MOVE.w  d3,d0 ; XLoop
  17429. PerfBlit2bCookieXLoop
  17430.       MOVE.l  -(a3),d5 ; Get dest
  17431.       MOVE.l  -(a4),d1 ; Get mask
  17432.       AND.l   d1,d5 ; And data
  17433.       OR.l    -(a2),d5 ; Get data
  17434.       AND.l   d1,-(a5) ; Output stencil
  17435.       MOVE.l  d5,(a3) ; Output data
  17436.       DBRA    d0,PerfBlit2bCookieXLoop
  17437.     SUB.w d6,a2
  17438.     SUB.w d6,a4
  17439.     SUB.w d7,a3
  17440.     SUB.w d7,a5
  17441.     DBRA  d4,PerfBlit2bCookieYLoop
  17442.   RTS
  17443. PerfBlit2bEraseYLoop
  17444.     MOVE.w  d3,d0 ; XLoop
  17445. PerfBlit2bEraseXLoop
  17446.       MOVE.l  -(a4),d5 ; Get mask
  17447.       AND.l   d5,-(a3) ; And mask with dest data
  17448.       OR.l    d5,-(a5) ; And mask with dest stencil
  17449.       DBRA    d0,PerfBlit2bEraseXLoop
  17450.     SUB.w d6,a4
  17451.     SUB.w d7,a3
  17452.     SUB.w d7,a5
  17453.     DBRA  d4,PerfBlit2bEraseYLoop
  17454.   RTS
  17455. PerfBlit2bCheck2 ; Do more type tests
  17456.   CMP.b   #3,d0 ; What type of blit?
  17457.   BEQ     PerfBlit2bSolidYLoop
  17458.   BGT     PerfBlit2bCheck3
  17459. PerfBlit2bInvYLoop
  17460.     MOVE.w  d3,d0 ; XLoop
  17461. PerfBlit2bInvXLoop
  17462.       MOVE.l  -(a4),d5 ; Get mask
  17463.       NOT.l   d5 ; Inverse mask for graphic
  17464.       EOR.l   d5,-(a3) ; Xor mask with dest data
  17465.       EOR.l   d5,-(a5) ; Xor mask with dest stencil
  17466.       DBRA    d0,PerfBlit2bInvXLoop
  17467.     SUB.w d6,a4
  17468.     SUB.w d7,a3
  17469.     SUB.w d7,a5
  17470.     DBRA  d4,PerfBlit2bInvYLoop
  17471.   RTS
  17472. PerfBlit2bSolidYLoop
  17473.     MOVE.w  d3,d0 ; XLoop
  17474. PerfBlit2bSolidXLoop
  17475.       MOVE.l  -(a4),d5 ; Get mask
  17476.       AND.l   d5,-(a5) ; Or mask with dest stencil
  17477.       NOT.l   d5 ; Inverse mask for graphic
  17478.       OR.l    d5,-(a3) ; Or mask with dest data
  17479.       DBRA    d0,PerfBlit2bSolidXLoop
  17480.     SUB.w d6,a4
  17481.     SUB.w d7,a3
  17482.     SUB.w d7,a5
  17483.     DBRA  d4,PerfBlit2bSolidYLoop
  17484.   RTS
  17485. PerfBlit2bCheck3
  17486.   CMP.b   #5,d0 ; What type of blit?
  17487.   BEQ     PerfBlit2bRe_Map
  17488.   BGT     PerfBlit2bCheck4
  17489.   MOVE.b  CurrentInk1,d5
  17490.   MOVE.b  d5,d1
  17491.   LSL.w   #8,d5
  17492.   MOVE.b  d1,d5
  17493.   MOVE.w  d5,d1
  17494.   SWAP    d5
  17495.   MOVE.w  d1,d5
  17496.   MOVE.l  a6,-(a7) ; Store
  17497.   MOVE.w  d3,a6
  17498. PerfBlit2bColourYLoop
  17499.     MOVE.w  a6,d0 ; XLoop
  17500. PerfBlit2bColourXLoop
  17501.       MOVE.l  -(a3),d3 ; Get dest
  17502.       MOVE.l  d5,d2 ; Copy colour
  17503.       MOVE.l  -(a4),d1 ; Get mask
  17504.       AND.l   d1,d3 ; And with dest
  17505.       AND.l    d1,-(a5) ; Write mask
  17506.       NOT.l   d1 ; Inverse mask
  17507.       AND.l   d1,d2 ; Make graphic
  17508.       OR.l    d2,d3 ; Combine
  17509.       MOVE.l  d3,(a3) ; Output
  17510.       DBRA    d0,PerfBlit2bColourXLoop
  17511.     SUB.w   d6,a4
  17512.     SUB.w   d7,a3
  17513.     SUB.w   d7,a5
  17514.     DBRA    d4,PerfBlit2bColourYLoop
  17515.   MOVE.l  (a7)+,a6 ; Restore
  17516.   RTS
  17517. PerfBlit2bRe_Map
  17518.   MOVE.w  CurrentChunkyTable1,d0
  17519.   !GetTableObjectPtr ; table base in a0
  17520.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0
  17521.   MOVE.w  d3,a1
  17522.   MOVEQ.l #0,d1
  17523.   MOVEQ.l #0,d2
  17524.   MOVEQ.l #0,d3
  17525.   MOVEQ.l #0,d5
  17526. PerfBlit2bReMapYLoop
  17527.     MOVE.w  a1,d0 ; XLoop
  17528. PerfBlit2bReMapXLoop
  17529.       MOVE.b  -(a2),d1 ; Get data
  17530.       MOVE.b  -(a2),d2 ; Get data
  17531.       LSL.w   #8,d1
  17532.       MOVE.b  -(a2),d3 ; Get data
  17533.       LSL.w   #8,d2
  17534.       MOVE.b  -(a2),d5 ; Get data
  17535.       LSL.w   #8,d3
  17536.       MOVE.b  -(a3),d1
  17537.       LSL.w   #8,d5
  17538.       MOVE.b  -(a3),d2
  17539.       MOVE.b  -(a3),d3
  17540.       MOVE.b  -(a3),d5
  17541.       SUBQ.w  #1,d0
  17542.       BLT     PerfBlit2bReMapXSkip
  17543. PerfBlit2bReMapXXLoop
  17544.       MOVE.b  0(a0,d1.l),3(a3)
  17545.       MOVE.b  -(a2),d1 ; Get data
  17546.       MOVE.b  0(a0,d2.l),2(a3)
  17547.       MOVE.b  -(a2),d2 ; Get data
  17548.       MOVE.b  0(a0,d3.l),1(a3)
  17549.       LSL.w   #8,d1
  17550.       MOVE.b  0(a0,d5.l),(a3)
  17551.       MOVE.l  -(a4),d5 ; Get cookie
  17552.       MOVE.b  -(a2),d3 ; Get data
  17553.       OR.l    d5,-(a5) ; Write stencil
  17554.       MOVEQ.l #0,d5 ; init
  17555.       LSL.w   #8,d2
  17556.       MOVE.b  -(a2),d5 ; Get data
  17557.       LSL.w   #8,d3
  17558.       MOVE.b  -(a3),d1
  17559.       LSL.w   #8,d5
  17560.       MOVE.b  -(a3),d2
  17561.       MOVE.b  -(a3),d3
  17562.       MOVE.b  -(a3),d5
  17563.       DBRA    d0,PerfBlit2bReMapXXLoop
  17564. PerfBlit2bReMapXSkip
  17565.     MOVE.b  0(a0,d5.l),(a3) ; Write
  17566.     MOVE.b  0(a0,d3.l),1(a3)
  17567.     SUB.w d6,a2
  17568.     MOVE.b  0(a0,d2.l),2(a3)
  17569.     MOVE.b  0(a0,d1.l),3(a3)
  17570.     MOVE.l  -(a4),d3 ; Get cookie
  17571.     SUB.w d7,a3
  17572.     OR.l    d3,-(a5) ; Write stencil
  17573.     SUB.w d6,a4
  17574.     SUB.w d7,a5
  17575.     DBRA  d4,PerfBlit2bReMapYLoop
  17576.   RTS
  17577. PerfBlit2bCheck4
  17578.   CMP.b   #7,d0 ; What type of blit?
  17579.   BEQ     PerfBlit2b_Add
  17580.   BGT     PerfBlit2bCheck5
  17581. PerfBlit2bSimpleReMap
  17582.   MOVE.w  CurrentChunkyTable1,d0
  17583.   !GetTableObjectPtr ; table base in a0
  17584.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0
  17585.   MOVE.w  d3,a1
  17586.   MOVEQ.l #0,d1
  17587.   MOVEQ.l #0,d2
  17588.   MOVEQ.l #4,d3
  17589. PerfBlit2bSimpleReMapYLoop
  17590.     MOVE.w  a1,d0 ; XLoop
  17591. PerfBlit2bSimpleReMapXLoop
  17592.       SUB.w   d3,a3
  17593.       TST.b   -(a4) ; Mask?
  17594.       BNE     PerfBlit2bSimpleReMapSkip1
  17595.       MOVE.b  3(a3),d1 ; Get dest
  17596.       MOVE.b  0(a0,d1.w),3(a3)
  17597. PerfBlit2bSimpleReMapSkip1
  17598.       TST.b   -(a4) ; Mask?
  17599.       BNE     PerfBlit2bSimpleReMapSkip2
  17600.       MOVE.b  2(a3),d2 ; Get dest
  17601.       MOVE.b  0(a0,d2.w),2(a3)
  17602. PerfBlit2bSimpleReMapSkip2
  17603.       TST.b   -(a4) ; Mask?
  17604.       BNE     PerfBlit2bSimpleReMapSkip3
  17605.       MOVE.b  1(a3),d1 ; Get dest
  17606.       MOVE.b  0(a0,d1.w),1(a3)
  17607. PerfBlit2bSimpleReMapSkip3
  17608.       TST.b   -(a4) ; Mask?
  17609.       BNE     PerfBlit2bSimpleReMapSkip4
  17610.       MOVE.b  (a3),d2 ; Get dest
  17611.       MOVE.b  0(a0,d2.w),0(a3)
  17612. PerfBlit2bSimpleReMapSkip4
  17613.       MOVE.l  (a4),d5
  17614.       OR.l    d5,-(a5)
  17615.       DBRA    d0,PerfBlit2bSimpleReMapXLoop
  17616.     SUB.w d7,a3
  17617.     SUB.w d6,a4
  17618.     SUB.w d7,a5
  17619.     DBRA  d4,PerfBlit2bSimpleReMapYLoop
  17620.   RTS
  17621. PerfBlit2b_Add
  17622. PerfBlit2bAddYLoop
  17623.     MOVE.w  d3,d0 ; XLoop
  17624. PerfBlit2bAddXLoop
  17625.       MOVE.l  -(a2),d1 ; Get source data
  17626.       MOVE.l  -(a4),d2 ; Get source stencil
  17627.       ADD.b   d1,-(a3) ; Add to dest
  17628.       LSR.w   #8,d1
  17629.       ADD.b   d1,-(a3) ; Add to dest
  17630.       SWAP    d1
  17631.       ADD.b   d1,-(a3) ; Add to dest
  17632.       LSR.w   #8,d1
  17633.       ADD.b   d1,-(a3) ; Add to dest
  17634.       AND.l   d2,-(a5) ; Write stencil
  17635.       DBRA    d0,PerfBlit2bAddXLoop
  17636.     SUB.w d6,a2
  17637.     SUB.w d6,a4
  17638.     SUB.w d7,a3
  17639.     SUB.w d7,a5
  17640.     DBRA  d4,PerfBlit2bAddYLoop
  17641.   RTS
  17642. PerfBlit2bCheck5
  17643.   ; Next check
  17644.   RTS
  17645.  
  17646. PerformBlit2_16
  17647. ;Do a `Blit' stencilled-blit, width should be multiple of 16. Addresses don't need to be aligned
  17648. ;Copies data using stencil for cookie-cut, does same with cookie to stencil
  17649. ;d0=BlitModeType
  17650. ;d3=Operation width
  17651. ;d4=Operation height
  17652. ;d6=Source linemodulo
  17653. ;d7=Dest linemodulo
  17654. ;a2=Source data address
  17655. ;a3=Dest data address
  17656. ;a4=Source stencil address
  17657. ;a5=Dest stencil address
  17658. ;Trashes many
  17659.   LSR.w   #4,d3 ; Width/16 for groups of 4 longwords
  17660.   SUBQ.w  #1,d4 ; YLoopcounter
  17661.   SUBQ.w  #1,d3 ; XLoopcounter
  17662.   CMP.b   #1,d0 ; What type of blit?
  17663.   BEQ     PerfBlit2_16_Erase
  17664.   BGT     PerfBlit2_16Check2
  17665.   MOVE.w  d3,a0
  17666. PerfBlit2_16CookieYLoop
  17667.     MOVE.w  a0,d0 ; XLoop
  17668. PerfBlit2_16CookieXLoop
  17669.       MOVE.l  (a3),d1 ; Get dest
  17670.       MOVE.l  (a4)+,d3 ; Get mask
  17671.       MOVE.l  4(a3),d2 ; Get dest
  17672.       MOVE.l  (a4)+,d5 ; Get mask
  17673.       AND.l   d3,d1 ; And data
  17674.       OR.l    (a2)+,d1 ; Get data
  17675.       AND.l   d5,d2 ; And data
  17676.       OR.l    (a2)+,d2 ; Get data
  17677.       MOVE.l  d1,(a3)+ ; Output data
  17678.       AND.l   d3,(a5)+ ; Output stencil
  17679.       MOVE.l  d2,(a3)+ ; Output data
  17680.       AND.l   d5,(a5)+ ; Output stencil
  17681.       MOVE.l  (a3),d1 ; Get dest
  17682.       MOVE.l  (a4)+,d3 ; Get mask
  17683.       MOVE.l  4(a3),d2 ; Get dest
  17684.       MOVE.l  (a4)+,d5 ; Get mask
  17685.       AND.l   d3,d1 ; And data
  17686.       OR.l    (a2)+,d1 ; Get data
  17687.       AND.l   d5,d2 ; And data
  17688.       OR.l    (a2)+,d2 ; Get data
  17689.       MOVE.l  d1,(a3)+ ; Output data
  17690.       AND.l   d3,(a5)+ ; Output stencil
  17691.       MOVE.l  d2,(a3)+ ; Output data
  17692.       AND.l   d5,(a5)+ ; Output stencil
  17693.       DBRA    d0,PerfBlit2_16CookieXLoop
  17694.     ADD.w d6,a2
  17695.     ADD.w d6,a4
  17696.     ADD.w d7,a3
  17697.     ADD.w d7,a5
  17698.     DBRA  d4,PerfBlit2_16CookieYLoop
  17699.   RTS
  17700. PerfBlit2_16_Erase
  17701.   MOVE.w  d3,a0
  17702. PerfBlit2_16EraseYLoop
  17703.     MOVE.w  a0,d0 ; XLoop
  17704. PerfBlit2_16EraseXLoop
  17705.       MOVE.l  (a4)+,d1 ; Get mask
  17706.       MOVE.l  (a4)+,d2
  17707.       AND.l   d1,(a3)+ ; And mask with dest data
  17708.       MOVE.l  (a4)+,d3
  17709.       OR.l    d1,(a5)+ ; And mask with dest stencil
  17710.       AND.l   d2,(a3)+
  17711.       MOVE.l  (a4)+,d5
  17712.       OR.l    d2,(a5)+
  17713.       AND.l   d3,(a3)+
  17714.       OR.l    d3,(a5)+
  17715.       AND.l   d5,(a3)+
  17716.       OR.l    d5,(a5)+
  17717.       DBRA    d0,PerfBlit2_16EraseXLoop
  17718.     ADD.w d6,a4
  17719.     ADD.w d7,a3
  17720.     ADD.w d7,a5
  17721.     DBRA  d4,PerfBlit2_16EraseYLoop
  17722.   RTS
  17723. PerfBlit2_16Check2 ; Do more type tests
  17724.   CMP.b   #3,d0 ; What type of blit?
  17725.   BEQ     PerfBlit2_16Solid
  17726.   BGT     PerfBlit2_16Check3
  17727.   MOVE.w  d3,a0
  17728. PerfBlit2_16InvYLoop
  17729.     MOVE.w  a0,d0 ; XLoop
  17730. PerfBlit2_16InvXLoop
  17731.       MOVE.l  (a4)+,d1 ; Get mask
  17732.       MOVE.l  (a4)+,d2
  17733.       NOT.l   d1 ; Inverse mask for graphic
  17734.       MOVE.l  (a4)+,d3
  17735.       NOT.l   d2
  17736.       MOVE.l  (a4)+,d5
  17737.       NOT.l   d3
  17738.       EOR.l   d1,(a3)+ ; Xor mask with dest data
  17739.       EOR.l   d1,(a5)+ ; Xor mask with dest stencil
  17740.       NOT.l   d5
  17741.       EOR.l   d2,(a3)+
  17742.       EOR.l   d2,(a5)+
  17743.       EOR.l   d3,(a3)+
  17744.       EOR.l   d3,(a5)+
  17745.       EOR.l   d5,(a3)+
  17746.       EOR.l   d5,(a5)+
  17747.       DBRA    d0,PerfBlit2_16InvXLoop
  17748.     ADD.w d6,a4
  17749.     ADD.w d7,a3
  17750.     ADD.w d7,a5
  17751.     DBRA  d4,PerfBlit2_16InvYLoop
  17752.   RTS
  17753. PerfBlit2_16Solid
  17754. PerfBlit2_16SolidYLoop
  17755.     MOVE.w  d3,d0 ; XLoop
  17756. PerfBlit2_16SolidXLoop
  17757.       MOVE.l  (a4)+,d1 ; Get mask
  17758.       MOVE.l  (a4)+,d2
  17759.       MOVE.l  (a4)+,d3
  17760.       MOVE.l  (a4)+,d5
  17761.       OR.l    d1,(a5)+ ; Or mask with dest stencil
  17762.       OR.l    d2,(a5)+
  17763.       OR.l    d3,(a5)+
  17764.       NOT.l   d1 ; Inverse mask for graphic
  17765.       OR.l    d5,(a5)+
  17766.       NOT.l   d2
  17767.       OR.l    d1,(a3)+ ; Or mask with dest data
  17768.       NOT.l   d3
  17769.       OR.l    d2,(a3)+
  17770.       NOT.l   d5
  17771.       OR.l    d3,(a3)+
  17772.       OR.l    d5,(a3)+
  17773.       DBRA    d0,PerfBlit2_16SolidXLoop
  17774.     ADD.w d6,a4
  17775.     ADD.w d7,a3
  17776.     ADD.w d7,a5
  17777.     DBRA  d4,PerfBlit2_16SolidYLoop
  17778.   RTS
  17779. PerfBlit2_16Check3
  17780.   CMP.b   #5,d0 ; What type of blit?
  17781.   BEQ     PerfBlit2_16Re_Map
  17782.   BGT     PerfBlit2_16Check4
  17783.   MOVE.b  CurrentInk1,d5
  17784.   MOVE.b  d5,d1
  17785.   LSL.w   #8,d5
  17786.   MOVE.b  d1,d5
  17787.   MOVE.w  d5,d1
  17788.   SWAP    d5
  17789.   MOVE.w  d1,d5
  17790.   MOVE.l  a6,-(a7) ; Store
  17791.   MOVE.w  d3,a6
  17792. PerfBlit2_16ColourYLoop
  17793.     MOVE.w  a6,d0 ; XLoop
  17794. PerfBlit2_16ColourXLoop
  17795.       MOVE.l  (a3),d3 ; Get dest
  17796.       MOVE.l  (a4)+,d1 ; Get mask
  17797.       MOVE.l  d5,d2 ; Copy colour
  17798.       AND.l   d1,d3 ; And with dest
  17799.       AND.l   d1,(a5)+ ; Write mask
  17800.       NOT.l   d1 ; Inverse mask
  17801.       AND.l   d1,d2 ; Make graphic
  17802.       OR.l    d2,d3 ; Combine
  17803.       MOVE.l  d3,(a3)+ ; Output
  17804.       MOVE.l  d5,d2 ; Copy colour
  17805.       MOVE.l  (a3),d3 ; Get dest
  17806.       MOVE.l  (a4)+,d1 ; Get mask
  17807.       AND.l   d1,d3 ; And with dest
  17808.       AND.l   d1,(a5)+ ; Write mask
  17809.       NOT.l   d1 ; Inverse mask
  17810.       AND.l   d1,d2 ; Make graphic
  17811.       OR.l    d2,d3 ; Combine
  17812.       MOVE.l  d3,(a3)+ ; Output
  17813.       MOVE.l  d5,d2 ; Copy colour
  17814.       MOVE.l  (a3),d3 ; Get dest
  17815.       MOVE.l  (a4)+,d1 ; Get mask
  17816.       AND.l   d1,d3 ; And with dest
  17817.       AND.l   d1,(a5)+ ; Write mask
  17818.       NOT.l   d1 ; Inverse mask
  17819.       AND.l   d1,d2 ; Make graphic
  17820.       OR.l    d2,d3 ; Combine
  17821.       MOVE.l  d3,(a3)+ ; Output
  17822.       MOVE.l  d5,d2 ; Copy colour
  17823.       MOVE.l  (a3),d3 ; Get dest
  17824.       MOVE.l  (a4)+,d1 ; Get mask
  17825.       AND.l   d1,d3 ; And with dest
  17826.       AND.l   d1,(a5)+ ; Write mask
  17827.       NOT.l   d1 ; Inverse mask
  17828.       AND.l   d1,d2 ; Make graphic
  17829.       OR.l    d2,d3 ; Combine
  17830.       MOVE.l  d3,(a3)+ ; Output
  17831.       DBRA    d0,PerfBlit2_16ColourXLoop
  17832.     ADD.w   d6,a4
  17833.     ADD.w   d7,a3
  17834.     ADD.w   d7,a5
  17835.     DBRA    d4,PerfBlit2_16ColourYLoop
  17836.   MOVE.l  (a7)+,a6 ; Restore
  17837.   RTS
  17838. PerfBlit2_16Re_Map
  17839.   MOVE.w  CurrentChunkyTable1,d0
  17840.   !GetTableObjectPtr ; table base in a0
  17841.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0
  17842.   MOVE.w  d3,a1
  17843.   MOVEQ.l #0,d1
  17844.   MOVEQ.l #0,d2
  17845.   MOVEQ.l #0,d3
  17846.   MOVEQ.l #0,d5
  17847. PerfBlit2_16ReMapYLoop
  17848.     MOVE.w  a1,d0 ; XLoop
  17849. PerfBlit2_16ReMapXLoop
  17850.       MOVE.b  (a2)+,d1 ; Get data
  17851.       MOVE.b  (a2)+,d2 ; Get data
  17852.       LSL.w   #8,d1
  17853.       MOVE.b  (a2)+,d3 ; Get data
  17854.       LSL.w   #8,d2
  17855.       MOVE.b  (a2)+,d5 ; Get data
  17856.       LSL.w   #8,d3
  17857.       MOVE.b  (a3),d1
  17858.       LSL.w   #8,d5
  17859.       MOVE.b  0(a0,d1.l),(a3)+ ; Write
  17860.       MOVE.b  (a3),d2
  17861.       MOVE.b  0(a0,d2.l),(a3)+
  17862.       MOVE.b  (a3),d3
  17863.       MOVE.b  0(a0,d3.l),(a3)+
  17864.       MOVE.b  (a3),d5
  17865.       MOVE.b  0(a0,d5.l),(a3)+
  17866.       MOVE.l  (a4)+,d3 ; Get cookie
  17867.       OR.l    d3,(a5)+ ; Write stencil
  17868.       MOVE.b  (a2)+,d1 ; Get data
  17869.       MOVEQ.l #0,d3 ; init
  17870.       MOVE.b  (a2)+,d2 ; Get data
  17871.       LSL.w   #8,d1
  17872.       MOVE.b  (a2)+,d3 ; Get data
  17873.       LSL.w   #8,d2
  17874.       MOVE.b  (a2)+,d5 ; Get data
  17875.       LSL.w   #8,d3
  17876.       MOVE.b  (a3),d1
  17877.       LSL.w   #8,d5
  17878.       MOVE.b  0(a0,d1.l),(a3)+ ; Write
  17879.       MOVE.b  (a3),d2
  17880.       MOVE.b  0(a0,d2.l),(a3)+
  17881.       MOVE.b  (a3),d3
  17882.       MOVE.b  0(a0,d3.l),(a3)+
  17883.       MOVE.b  (a3),d5
  17884.       MOVE.b  0(a0,d5.l),(a3)+
  17885.       MOVE.l  (a4)+,d3 ; Get cookie
  17886.       OR.l    d3,(a5)+ ; Write stencil
  17887.       MOVE.b  (a2)+,d1 ; Get data
  17888.       MOVEQ.l #0,d3 ; init
  17889.       MOVE.b  (a2)+,d2 ; Get data
  17890.       LSL.w   #8,d1
  17891.       MOVE.b  (a2)+,d3 ; Get data
  17892.       LSL.w   #8,d2
  17893.       MOVE.b  (a2)+,d5 ; Get data
  17894.       LSL.w   #8,d3
  17895.       MOVE.b  (a3),d1
  17896.       LSL.w   #8,d5
  17897.       MOVE.b  0(a0,d1.l),(a3)+ ; Write
  17898.       MOVE.b  (a3),d2
  17899.       MOVE.b  0(a0,d2.l),(a3)+
  17900.       MOVE.b  (a3),d3
  17901.       MOVE.b  0(a0,d3.l),(a3)+
  17902.       MOVE.b  (a3),d5
  17903.       MOVE.b  0(a0,d5.l),(a3)+
  17904.       MOVE.l  (a4)+,d3 ; Get cookie
  17905.       OR.l    d3,(a5)+ ; Write stencil
  17906.       MOVE.b  (a2)+,d1 ; Get data
  17907.       MOVEQ.l #0,d3 ; Init
  17908.       MOVE.b  (a2)+,d2 ; Get data
  17909.       LSL.w   #8,d1
  17910.       MOVE.b  (a2)+,d3 ; Get data
  17911.       LSL.w   #8,d2
  17912.       MOVE.b  (a2)+,d5 ; Get data
  17913.       LSL.w   #8,d3
  17914.       MOVE.b  (a3),d1
  17915.       LSL.w   #8,d5
  17916.       MOVE.b  0(a0,d1.l),(a3)+ ; Write
  17917.       MOVE.b  (a3),d2
  17918.       MOVE.b  0(a0,d2.l),(a3)+
  17919.       MOVE.b  (a3),d3
  17920.       MOVE.b  0(a0,d3.l),(a3)+
  17921.       MOVE.b  (a3),d5
  17922.       MOVE.b  0(a0,d5.l),(a3)+
  17923.       MOVE.l  (a4)+,d3 ; Get cookie
  17924.       OR.l    d3,(a5)+ ; Write stencil
  17925.       MOVEQ.l #0,d3 ; Init
  17926.       DBRA    d0,PerfBlit2_16ReMapXLoop
  17927.     ADD.w d6,a2
  17928.     ADD.w d6,a4
  17929.     ADD.w d7,a3
  17930.     ADD.w d7,a5
  17931.     DBRA  d4,PerfBlit2_16ReMapYLoop
  17932.   RTS
  17933. PerfBlit2_16Check4
  17934.   CMP.b   #7,d0 ; What type of blit?
  17935.   BEQ     PerfBlit2_16_Add
  17936.   BGT     PerfBlit2_16Check5
  17937. PerfBlit2_16SimpleReMap
  17938.   MOVE.w  CurrentChunkyTable1,d0
  17939.   !GetTableObjectPtr ; table base in a0
  17940.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0
  17941.   MOVE.w  d3,a1
  17942.   MOVEQ.l #0,d1
  17943.   MOVEQ.l #0,d2
  17944.   MOVEQ.l #16,d3
  17945. PerfBlit2_16SimpleReMapYLoop
  17946.     MOVE.w  a1,d0 ; XLoop
  17947. PerfBlit2_16SimpleReMapXLoop
  17948.       CMP.l   #-1,(a4)
  17949.       BEQ     PerfBlit2_16SimpleReMapSkip4
  17950.       TST.b   (a4) ; Mask?
  17951.       BNE     PerfBlit2_16SimpleReMapSkip1
  17952.       MOVE.b  (a3),d1 ; Get dest
  17953.       MOVE.b  0(a0,d1.w),(a3)
  17954. PerfBlit2_16SimpleReMapSkip1
  17955.       TST.b   1(a4) ; Mask?
  17956.       BNE     PerfBlit2_16SimpleReMapSkip2
  17957.       MOVE.b  1(a3),d2 ; Get dest
  17958.       MOVE.b  0(a0,d2.w),1(a3)
  17959. PerfBlit2_16SimpleReMapSkip2
  17960.       TST.b   2(a4) ; Mask?
  17961.       BNE     PerfBlit2_16SimpleReMapSkip3
  17962.       MOVE.b  2(a3),d1 ; Get dest
  17963.       MOVE.b  0(a0,d1.w),2(a3)
  17964. PerfBlit2_16SimpleReMapSkip3
  17965.       TST.b   3(a4) ; Mask?
  17966.       BNE     PerfBlit2_16SimpleReMapSkip4
  17967.       MOVE.b  3(a3),d2 ; Get dest
  17968.       MOVE.b  0(a0,d2.w),3(a3)
  17969. PerfBlit2_16SimpleReMapSkip4
  17970.       MOVE.l  (a4)+,d5
  17971.       OR.l    d5,(a5)+
  17972.       CMP.l   #-1,(a4)
  17973.       BEQ     PerfBlit2_16SimpleReMapSkip8
  17974.       TST.b   (a4) ; Mask?
  17975.       BNE     PerfBlit2_16SimpleReMapSkip5
  17976.       MOVE.b  4(a3),d1 ; Get dest
  17977.       MOVE.b  0(a0,d1.w),4(a3)
  17978. PerfBlit2_16SimpleReMapSkip5
  17979.       TST.b   1(a4) ; Mask?
  17980.       BNE     PerfBlit2_16SimpleReMapSkip6
  17981.       MOVE.b  5(a3),d2 ; Get dest
  17982.       MOVE.b  0(a0,d2.w),5(a3)
  17983. PerfBlit2_16SimpleReMapSkip6
  17984.       TST.b   2(a4) ; Mask?
  17985.       BNE     PerfBlit2_16SimpleReMapSkip7
  17986.       MOVE.b  6(a3),d1 ; Get dest
  17987.       MOVE.b  0(a0,d1.w),6(a3)
  17988. PerfBlit2_16SimpleReMapSkip7
  17989.       TST.b   3(a4) ; Mask?
  17990.       BNE     PerfBlit2_16SimpleReMapSkip8
  17991.       MOVE.b  7(a3),d2 ; Get dest
  17992.       MOVE.b  0(a0,d2.w),7(a3)
  17993. PerfBlit2_16SimpleReMapSkip8
  17994.       MOVE.l  (a4)+,d5
  17995.       OR.l    d5,(a5)+
  17996.       CMP.l   #-1,(a4)
  17997.       BEQ     PerfBlit2_16SimpleReMapSkip12
  17998.       TST.b   (a4) ; Mask?
  17999.       BNE     PerfBlit2_16SimpleReMapSkip9
  18000.       MOVE.b  8(a3),d1 ; Get dest
  18001.       MOVE.b  0(a0,d1.w),8(a3)
  18002. PerfBlit2_16SimpleReMapSkip9
  18003.       TST.b   1(a4) ; Mask?
  18004.       BNE     PerfBlit2_16SimpleReMapSkip10
  18005.       MOVE.b  9(a3),d2 ; Get dest
  18006.       MOVE.b  0(a0,d2.w),9(a3)
  18007. PerfBlit2_16SimpleReMapSkip10
  18008.       TST.b   2(a4) ; Mask?
  18009.       BNE     PerfBlit2_16SimpleReMapSkip11
  18010.       MOVE.b  10(a3),d1 ; Get dest
  18011.       MOVE.b  0(a0,d1.w),10(a3)
  18012. PerfBlit2_16SimpleReMapSkip11
  18013.       TST.b   3(a4) ; Mask?
  18014.       BNE     PerfBlit2_16SimpleReMapSkip12
  18015.       MOVE.b  11(a3),d2 ; Get dest
  18016.       MOVE.b  0(a0,d2.w),11(a3)
  18017. PerfBlit2_16SimpleReMapSkip12
  18018.       MOVE.l  (a4)+,d5
  18019.       OR.l    d5,(a5)+
  18020.       CMP.l   #-1,(a4)
  18021.       BEQ     PerfBlit2_16SimpleReMapSkip16
  18022.       TST.b   (a4) ; Mask?
  18023.       BNE     PerfBlit2_16SimpleReMapSkip13
  18024.       MOVE.b  12(a3),d1 ; Get dest
  18025.       MOVE.b  0(a0,d1.w),12(a3)
  18026. PerfBlit2_16SimpleReMapSkip13
  18027.       TST.b   1(a4) ; Mask?
  18028.       BNE     PerfBlit2_16SimpleReMapSkip14
  18029.       MOVE.b  13(a3),d2 ; Get dest
  18030.       MOVE.b  0(a0,d2.w),13(a3)
  18031. PerfBlit2_16SimpleReMapSkip14
  18032.       TST.b   2(a4) ; Mask?
  18033.       BNE     PerfBlit2_16SimpleReMapSkip15
  18034.       MOVE.b  14(a3),d1 ; Get dest
  18035.       MOVE.b  0(a0,d1.w),14(a3)
  18036. PerfBlit2_16SimpleReMapSkip15
  18037.       TST.b   3(a4) ; Mask?
  18038.       BNE     PerfBlit2_16SimpleReMapSkip16
  18039.       MOVE.b  15(a3),d2 ; Get dest
  18040.       MOVE.b  0(a0,d2.w),15(a3)
  18041. PerfBlit2_16SimpleReMapSkip16
  18042.       MOVE.l  (a4)+,d5
  18043.       ADD.w   d3,a3
  18044.       OR.l    d5,(a5)+
  18045.       DBRA    d0,PerfBlit2_16SimpleReMapXLoop
  18046.     ADD.w d7,a3
  18047.     ADD.w d6,a4
  18048.     ADD.w d7,a5
  18049.     DBRA  d4,PerfBlit2_16SimpleReMapYLoop
  18050.   RTS
  18051. PerfBlit2_16_Add
  18052.   MOVE.w  d3,a0
  18053. PerfBlit2_16AddYLoop
  18054.     MOVE.w  a0,d0 ; XLoop
  18055. PerfBlit2_16AddXLoop
  18056.       MOVE.l  (a2)+,d1 ; Get source data
  18057.       MOVE.l  (a4)+,d3 ; Get source stencil
  18058.       MOVE.l  (a2)+,d2 ; Get source data
  18059.       MOVE.l  (a4)+,d5 ; Get source stencil
  18060.       ADD.b   d1,3(a3) ; Add to dest
  18061.       LSR.w   #8,d1
  18062.       ADD.b   d1,2(a3) ; Add to dest
  18063.       SWAP    d1
  18064.       ADD.b   d1,1(a3) ; Add to dest
  18065.       LSR.w   #8,d1
  18066.       ADD.b   d1,(a3) ; Add to dest
  18067.       AND.l   d3,(a5)+ ; Write stencil
  18068.       ADD.b   d2,7(a3) ; Add to dest
  18069.       AND.l   d5,(a5)+ ; Write stencil
  18070.       LSR.w   #8,d2
  18071.       ADD.b   d2,6(a3) ; Add to dest
  18072.       SWAP    d2
  18073.       ADD.b   d2,5(a3) ; Add to dest
  18074.       LSR.w   #8,d2
  18075.       ADD.b   d2,4(a3) ; Add to dest
  18076.       MOVE.l  (a2)+,d1 ; Get source data
  18077.       MOVE.l  (a4)+,d3 ; Get source stencil
  18078.       MOVE.l  (a2)+,d2 ; Get source data
  18079.       MOVE.l  (a4)+,d5 ; Get source stencil
  18080.       ADD.b   d1,11(a3) ; Add to dest
  18081.       LSR.w   #8,d1
  18082.       ADD.b   d1,10(a3) ; Add to dest
  18083.       SWAP    d1
  18084.       ADD.b   d1,9(a3) ; Add to dest
  18085.       LSR.w   #8,d1
  18086.       ADD.b   d1,8(a3) ; Add to dest
  18087.       AND.l   d3,(a5)+ ; Write stencil
  18088.       ADD.b   d2,15(a3) ; Add to dest
  18089.       AND.l   d5,(a5)+ ; Write stencil
  18090.       LSR.w   #8,d2
  18091.       ADD.b   d2,14(a3) ; Add to dest
  18092.       SWAP    d2
  18093.       ADD.b   d2,13(a3) ; Add to dest
  18094.       LSR.w   #8,d2
  18095.       ADD.b   d2,12(a3) ; Add to dest
  18096.       ADD.l   #16,a3 ; Skip
  18097.       DBRA    d0,PerfBlit2_16AddXLoop
  18098.     ADD.w d6,a2
  18099.     ADD.w d6,a4
  18100.     ADD.w d7,a3
  18101.     ADD.w d7,a5
  18102.     DBRA  d4,PerfBlit2_16AddYLoop
  18103.   RTS
  18104. PerfBlit2_16Check5
  18105.   ; Next check
  18106.   RTS
  18107.  
  18108. PerformBlit2b_16
  18109. ;Do a `Blit' stencilled-blit, width should be multiple of 16, backwards. Addresses dont need to be aligned
  18110. ;Copies data backwards using stencil for cookie-cut, does same with cookie to stencil
  18111. ;d0=BlitModeType
  18112. ;d3=Operation width
  18113. ;d4=Operation height
  18114. ;d6=Source linemodulo
  18115. ;d7=Dest linemodulo
  18116. ;a2=Source data address
  18117. ;a3=Dest data address
  18118. ;a4=Source stencil address
  18119. ;a5=Dest stencil address
  18120. ;Trashes many
  18121.   MOVE.w  d3,d5 ; Copy width
  18122.   ADD.w   d6,d5 ; Add source linemod
  18123.   MULU    d4,d5 ; Total bytes
  18124.   SUB.l   d6,d5 ; -Linemod of last line
  18125.   ADD.l   d5,a2 ; Add to source address
  18126.   ADD.l   d5,a4 ; Add to source stencil address
  18127.   MOVE.w  d3,d5 ; Get Width
  18128.   ADD.w   d7,d5 ; Add dest linemod
  18129.   MULU    d4,d5 ; Total bytes
  18130.   SUB.l   d7,d5 ; -Linemod of last line
  18131.   ADD.l   d5,a3 ; Add to dest address
  18132.   ADD.l   d5,a5 ; Add to dest stencil address
  18133.   LSR.w   #4,d3 ; Width/16 for groups of 4 longwords
  18134.   SUBQ.w  #1,d4 ; YLoopcounter
  18135.   SUBQ.w  #1,d3 ; XLoopcounter
  18136.   CMP.b   #1,d0 ; What type of blit?
  18137.   BEQ     PerfBlit2b_16_Erase
  18138.   BGT     PerfBlit2b_16Check2
  18139. PerfBlit2b_16CookieYLoop
  18140.     MOVE.w  d3,d0 ; XLoop
  18141. PerfBlit2b_16CookieXLoop
  18142.       MOVE.l  -(a3),d1 ; Get dest
  18143.       MOVE.l  -(a4),d3 ; Get mask
  18144.       MOVE.l  -(a3),d2 ; Get dest
  18145.       MOVE.l  -(a4),d5 ; Get mask
  18146.       AND.l   d3,d1 ; And data
  18147.       OR.l    -(a2),d1 ; Get data
  18148.       AND.l   d5,d2 ; And data
  18149.       OR.l    -(a2),d2 ; Get data
  18150.       MOVE.l  d1,4(a3) ; Output data
  18151.       AND.l   d3,-(a5) ; Output stencil
  18152.       MOVE.l  d2,(a3) ; Output data
  18153.       AND.l   d5,-(a5) ; Output stencil
  18154.       MOVE.l  -(a3),d1 ; Get dest
  18155.       MOVE.l  -(a4),d3 ; Get mask
  18156.       MOVE.l  -(a3),d2 ; Get dest
  18157.       MOVE.l  -(a4),d5 ; Get mask
  18158.       AND.l   d3,d1 ; And data
  18159.       OR.l    -(a2),d1 ; Get data
  18160.       AND.l   d5,d2 ; And data
  18161.       OR.l    -(a2),d2 ; Get data
  18162.       MOVE.l  d1,4(a3) ; Output data
  18163.       AND.l   d3,-(a5) ; Output stencil
  18164.       MOVE.l  d2,(a3) ; Output data
  18165.       AND.l   d5,-(a5) ; Output stencil
  18166.       DBRA    d0,PerfBlit2b_16CookieXLoop
  18167.     SUB.w d6,a2
  18168.     SUB.w d6,a4
  18169.     SUB.w d7,a3
  18170.     SUB.w d7,a5
  18171.     DBRA  d4,PerfBlit2b_16CookieYLoop
  18172.   RTS
  18173. PerfBlit2b_16_Erase
  18174.   MOVE.w  d3,a0
  18175. PerfBlit2b_16EraseYLoop
  18176.     MOVE.w  a0,d0 ; XLoop
  18177. PerfBlit2b_16EraseXLoop
  18178.       MOVE.l  -(a4),d1 ; Get mask
  18179.       MOVE.l  -(a4),d2
  18180.       AND.l   d1,-(a3) ; And mask with dest data
  18181.       MOVE.l  -(a4),d3
  18182.       OR.l    d1,-(a5) ; And mask with dest stencil
  18183.       AND.l   d2,-(a3)
  18184.       MOVE.l  -(a4),d5
  18185.       OR.l    d2,-(a5)
  18186.       AND.l   d3,-(a3)
  18187.       OR.l    d3,-(a5)
  18188.       AND.l   d5,-(a3)
  18189.       OR.l    d5,-(a5)
  18190.       DBRA    d0,PerfBlit2b_16EraseXLoop
  18191.     SUB.w d6,a4
  18192.     SUB.w d7,a3
  18193.     SUB.w d7,a5
  18194.     DBRA  d4,PerfBlit2b_16EraseYLoop
  18195.   RTS
  18196. PerfBlit2b_16Check2 ; Do more type tests
  18197.   CMP.b   #3,d0 ; What type of blit?
  18198.   BEQ     PerfBlit2b_16Solid
  18199.   BGT     PerfBlit2b_16Check3
  18200.   MOVE.w  d3,a0
  18201. PerfBlit2b_16InvYLoop
  18202.     MOVE.w  a0,d0 ; XLoop
  18203. PerfBlit2b_16InvXLoop
  18204.       MOVE.l  -(a4),d1 ; Get mask
  18205.       MOVE.l  -(a4),d2
  18206.       NOT.l   d1 ; Inverse mask for graphic
  18207.       MOVE.l  -(a4),d3
  18208.       NOT.l   d2
  18209.       MOVE.l  -(a4),d5
  18210.       NOT.l   d3
  18211.       EOR.l   d1,-(a3) ; Xor mask with dest data
  18212.       EOR.l   d1,-(a5) ; Xor mask with dest stencil
  18213.       NOT.l   d5
  18214.       EOR.l   d2,-(a3)
  18215.       EOR.l   d2,-(a5)
  18216.       EOR.l   d3,-(a3)
  18217.       EOR.l   d3,-(a5)
  18218.       EOR.l   d5,-(a3)
  18219.       EOR.l   d5,-(a5)
  18220.       DBRA    d0,PerfBlit2b_16InvXLoop
  18221.     SUB.w d6,a4
  18222.     SUB.w d7,a3
  18223.     SUB.w d7,a5
  18224.     DBRA  d4,PerfBlit2b_16InvYLoop
  18225.   RTS
  18226. PerfBlit2b_16Solid
  18227.   MOVE.w  d3,a0
  18228. PerfBlit2b_16SolidYLoop
  18229.     MOVE.w  a0,d0 ; XLoop
  18230. PerfBlit2b_16SolidXLoop
  18231.       MOVE.l  -(a4),d1 ; Get mask
  18232.       MOVE.l  -(a4),d2
  18233.       MOVE.l  -(a4),d3
  18234.       MOVE.l  -(a4),d5
  18235.       OR.l    d1,-(a5) ; Or mask with dest stencil
  18236.       OR.l    d2,-(a5)
  18237.       OR.l    d3,-(a5)
  18238.       NOT.l   d1 ; Inverse mask for graphic
  18239.       OR.l    d5,-(a5)
  18240.       NOT.l   d2
  18241.       OR.l    d1,-(a3) ; Or mask with dest data
  18242.       NOT.l   d3
  18243.       OR.l    d2,-(a3)
  18244.       NOT.l   d5
  18245.       OR.l    d3,-(a3)
  18246.       OR.l    d5,-(a3)
  18247.       DBRA    d0,PerfBlit2b_16SolidXLoop
  18248.     SUB.w d6,a4
  18249.     SUB.w d7,a3
  18250.     SUB.w d7,a5
  18251.     DBRA  d4,PerfBlit2b_16SolidYLoop
  18252.   RTS
  18253. PerfBlit2b_16Check3
  18254.   CMP.b   #5,d0 ; What type of blit?
  18255.   BEQ     PerfBlit2b_16Re_Map
  18256.   BGT     PerfBlit2b_16Check4
  18257.   MOVE.b  CurrentInk1,d5
  18258.   MOVE.b  d5,d1
  18259.   LSL.w   #8,d5
  18260.   MOVE.b  d1,d5
  18261.   MOVE.w  d5,d1
  18262.   SWAP    d5
  18263.   MOVE.w  d1,d5
  18264.   MOVE.l  a6,-(a7) ; Store
  18265.   MOVE.w  d3,a6
  18266. PerfBlit2b_16ColourYLoop
  18267.     MOVE.w  a6,d0 ; XLoop
  18268. PerfBlit2b_16ColourXLoop
  18269.       MOVE.l  -(a3),d3 ; Get dest
  18270.       MOVE.l  -(a4),d1 ; Get mask
  18271.       MOVE.l  d5,d2 ; Copy colour
  18272.       AND.l   d1,d3 ; And with dest
  18273.       AND.l   d1,-(a5) ; Write mask
  18274.       NOT.l   d1 ; Inverse mask
  18275.       AND.l   d1,d2 ; Make graphic
  18276.       OR.l    d2,d3 ; Combine
  18277.       MOVE.l  d3,(a3) ; Output
  18278.       MOVE.l  d5,d2 ; Copy colour
  18279.       MOVE.l  -(a3),d3 ; Get dest
  18280.       MOVE.l  -(a4),d1 ; Get mask
  18281.       AND.l   d1,d3 ; And with dest
  18282.       AND.l   d1,-(a5) ; Write mask
  18283.       NOT.l   d1 ; Inverse mask
  18284.       AND.l   d1,d2 ; Make graphic
  18285.       OR.l    d2,d3 ; Combine
  18286.       MOVE.l  d3,(a3) ; Output
  18287.       MOVE.l  d5,d2 ; Copy colour
  18288.       MOVE.l  -(a3),d3 ; Get dest
  18289.       MOVE.l  -(a4),d1 ; Get mask
  18290.       AND.l   d1,d3 ; And with dest
  18291.       AND.l   d1,-(a5) ; Write mask
  18292.       NOT.l   d1 ; Inverse mask
  18293.       AND.l   d1,d2 ; Make graphic
  18294.       OR.l    d2,d3 ; Combine
  18295.       MOVE.l  d3,(a3) ; Output
  18296.       MOVE.l  d5,d2 ; Copy colour
  18297.       MOVE.l  -(a3),d3 ; Get dest
  18298.       MOVE.l  -(a4),d1 ; Get mask
  18299.       AND.l   d1,d3 ; And with dest
  18300.       AND.l   d1,-(a5) ; Write mask
  18301.       NOT.l   d1 ; Inverse mask
  18302.       AND.l   d1,d2 ; Make graphic
  18303.       OR.l    d2,d3 ; Combine
  18304.       MOVE.l  d3,(a3) ; Output
  18305.       DBRA    d0,PerfBlit2b_16ColourXLoop
  18306.     SUB.w   d6,a4
  18307.     SUB.w   d7,a3
  18308.     SUB.w   d7,a5
  18309.     DBRA    d4,PerfBlit2b_16ColourYLoop
  18310.   MOVE.l  (a7)+,a6 ; Restore
  18311.   RTS
  18312. PerfBlit2b_16Re_Map
  18313.   MOVE.w  CurrentChunkyTable1,d0
  18314.   !GetTableObjectPtr ; table base in a0
  18315.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0
  18316.   MOVE.w  d3,a1
  18317.   MOVEQ.l #0,d1
  18318.   MOVEQ.l #0,d2
  18319.   MOVEQ.l #0,d3
  18320.   MOVEQ.l #0,d5
  18321. PerfBlit2b_16ReMapYLoop
  18322.     MOVE.w  a1,d0 ; XLoop
  18323. PerfBlit2b_16ReMapXLoop
  18324.       MOVE.b  -(a2),d1 ; Get data
  18325.       MOVE.b  -(a2),d2 ; Get data
  18326.       LSL.w   #8,d1
  18327.       MOVE.b  -(a2),d3 ; Get data
  18328.       LSL.w   #8,d2
  18329.       MOVE.b  -(a2),d5 ; Get data
  18330.       LSL.w   #8,d3
  18331.       MOVE.b  -(a3),d1
  18332.       LSL.w   #8,d5
  18333.       MOVE.b  0(a0,d1.l),(a3)
  18334.       MOVE.b  -(a3),d2
  18335.       MOVE.b  0(a0,d2.l),(a3)
  18336.       MOVE.b  -(a3),d3
  18337.       MOVE.b  0(a0,d3.l),(a3)
  18338.       MOVE.b  -(a3),d5
  18339.       MOVE.b  0(a0,d5.l),(a3) ; Write
  18340.       MOVE.l  -(a4),d3 ; Get cookie
  18341.       OR.l    d3,-(a5) ; Write stencil
  18342.       MOVE.b  -(a2),d1 ; Get data
  18343.       MOVEQ.l #0,d3 ; Init
  18344.       MOVE.b  -(a2),d2 ; Get data
  18345.       LSL.w   #8,d1
  18346.       MOVE.b  -(a2),d3 ; Get data
  18347.       LSL.w   #8,d2
  18348.       MOVE.b  -(a2),d5 ; Get data
  18349.       LSL.w   #8,d3
  18350.       MOVE.b  -(a3),d1
  18351.       LSL.w   #8,d5
  18352.       MOVE.b  0(a0,d1.l),(a3)
  18353.       MOVE.b  -(a3),d2
  18354.       MOVE.b  0(a0,d2.l),(a3)
  18355.       MOVE.b  -(a3),d3
  18356.       MOVE.b  0(a0,d3.l),(a3)
  18357.       MOVE.b  -(a3),d5
  18358.       MOVE.b  0(a0,d5.l),(a3) ; Write
  18359.       MOVE.l  -(a4),d3 ; Get cookie
  18360.       OR.l    d3,-(a5) ; Write stencil
  18361.       MOVE.b  -(a2),d1 ; Get data
  18362.       MOVEQ.l #0,d3 ; Init
  18363.       MOVE.b  -(a2),d2 ; Get data
  18364.       LSL.w   #8,d1
  18365.       MOVE.b  -(a2),d3 ; Get data
  18366.       LSL.w   #8,d2
  18367.       MOVE.b  -(a2),d5 ; Get data
  18368.       LSL.w   #8,d3
  18369.       MOVE.b  -(a3),d1
  18370.       LSL.w   #8,d5
  18371.       MOVE.b  0(a0,d1.l),(a3)
  18372.       MOVE.b  -(a3),d2
  18373.       MOVE.b  0(a0,d2.l),(a3)
  18374.       MOVE.b  -(a3),d3
  18375.       MOVE.b  0(a0,d3.l),(a3)
  18376.       MOVE.b  -(a3),d5
  18377.       MOVE.b  0(a0,d5.l),(a3) ; Write
  18378.       MOVE.l  -(a4),d3 ; Get cookie
  18379.       OR.l    d3,-(a5) ; Write stencil
  18380.       MOVE.b  -(a2),d1 ; Get data
  18381.       MOVEQ.l #0,d3 ; Init
  18382.       MOVE.b  -(a2),d2 ; Get data
  18383.       LSL.w   #8,d1
  18384.       MOVE.b  -(a2),d3 ; Get data
  18385.       LSL.w   #8,d2
  18386.       MOVE.b  -(a2),d5 ; Get data
  18387.       LSL.w   #8,d3
  18388.       MOVE.b  -(a3),d1
  18389.       LSL.w   #8,d5
  18390.       MOVE.b  0(a0,d1.l),(a3)
  18391.       MOVE.b  -(a3),d2
  18392.       MOVE.b  0(a0,d2.l),(a3)
  18393.       MOVE.b  -(a3),d3
  18394.       MOVE.b  0(a0,d3.l),(a3)
  18395.       MOVE.b  -(a3),d5
  18396.       MOVE.b  0(a0,d5.l),(a3) ; Write
  18397.       MOVE.l  -(a4),d3 ; Get cookie
  18398.       OR.l    d3,-(a5) ; Write stencil
  18399.       MOVEQ.l #0,d3 ; Init
  18400.       DBRA    d0,PerfBlit2b_16ReMapXLoop
  18401.     SUB.w d6,a2
  18402.     SUB.w d6,a4
  18403.     SUB.w d7,a3
  18404.     SUB.w d7,a5
  18405.     DBRA  d4,PerfBlit2b_16ReMapYLoop
  18406.   RTS
  18407. PerfBlit2b_16Check4
  18408.   CMP.b   #7,d0 ; What type of blit?
  18409.   BEQ     PerfBlit2b_16_Add
  18410.   BGT     PerfBlit2b_16Check5
  18411. PerfBlit2b_16SimpleReMap
  18412.   MOVE.w  CurrentChunkyTable1,d0
  18413.   !GetTableObjectPtr ; table base in a0
  18414.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0
  18415.   MOVE.w  d3,a1
  18416.   MOVEQ.l #0,d1
  18417.   MOVEQ.l #0,d2
  18418.   MOVEQ.l #16,d3
  18419. PerfBlit2b_16SimpleReMapYLoop
  18420.     MOVE.w  a1,d0 ; XLoop
  18421. PerfBlit2b_16SimpleReMapXLoop
  18422.       SUB.w   d3,a4
  18423.       SUB.w   d3,a3
  18424.       CMP.l   #-1,12(a4)
  18425.       BEQ     PerfBlit2b_16SimpleReMapSkip4
  18426.       TST.b   15(a4) ; Mask?
  18427.       BNE     PerfBlit2b_16SimpleReMapSkip1
  18428.       MOVE.b  15(a3),d1 ; Get dest
  18429.       MOVE.b  0(a0,d1.w),15(a3)
  18430. PerfBlit2b_16SimpleReMapSkip1
  18431.       TST.b   14(a4) ; Mask?
  18432.       BNE     PerfBlit2b_16SimpleReMapSkip2
  18433.       MOVE.b  14(a3),d2 ; Get dest
  18434.       MOVE.b  0(a0,d2.w),14(a3)
  18435. PerfBlit2b_16SimpleReMapSkip2
  18436.       TST.b   13(a4) ; Mask?
  18437.       BNE     PerfBlit2b_16SimpleReMapSkip3
  18438.       MOVE.b  13(a3),d1 ; Get dest
  18439.       MOVE.b  0(a0,d1.w),13(a3)
  18440. PerfBlit2b_16SimpleReMapSkip3
  18441.       TST.b   12(a4) ; Mask?
  18442.       BNE     PerfBlit2b_16SimpleReMapSkip4
  18443.       MOVE.b  12(a3),d2 ; Get dest
  18444.       MOVE.b  0(a0,d2.w),12(a3)
  18445. PerfBlit2b_16SimpleReMapSkip4
  18446.       MOVE.l  12(a4),d5
  18447.       OR.l    d5,-(a5)
  18448.       CMP.l   #-1,8(a4)
  18449.       BEQ     PerfBlit2b_16SimpleReMapSkip8
  18450.       TST.b   11(a4) ; Mask?
  18451.       BNE     PerfBlit2b_16SimpleReMapSkip5
  18452.       MOVE.b  11(a3),d1 ; Get dest
  18453.       MOVE.b  0(a0,d1.w),11(a3)
  18454. PerfBlit2b_16SimpleReMapSkip5
  18455.       TST.b   10(a4) ; Mask?
  18456.       BNE     PerfBlit2b_16SimpleReMapSkip6
  18457.       MOVE.b  10(a3),d2 ; Get dest
  18458.       MOVE.b  0(a0,d2.w),10(a3)
  18459. PerfBlit2b_16SimpleReMapSkip6
  18460.       TST.b   9(a4) ; Mask?
  18461.       BNE     PerfBlit2b_16SimpleReMapSkip7
  18462.       MOVE.b  9(a3),d1 ; Get dest
  18463.       MOVE.b  0(a0,d1.w),9(a3)
  18464. PerfBlit2b_16SimpleReMapSkip7
  18465.       TST.b   8(a4) ; Mask?
  18466.       BNE     PerfBlit2b_16SimpleReMapSkip8
  18467.       MOVE.b  8(a3),d2 ; Get dest
  18468.       MOVE.b  0(a0,d2.w),8(a3)
  18469. PerfBlit2b_16SimpleReMapSkip8
  18470.       MOVE.l  8(a4),d5
  18471.       OR.l    d5,-(a5)
  18472.       CMP.l   #-1,4(a4)
  18473.       BEQ     PerfBlit2b_16SimpleReMapSkip12
  18474.       TST.b   7(a4) ; Mask?
  18475.       BNE     PerfBlit2b_16SimpleReMapSkip9
  18476.       MOVE.b  7(a3),d1 ; Get dest
  18477.       MOVE.b  0(a0,d1.w),7(a3)
  18478. PerfBlit2b_16SimpleReMapSkip9
  18479.       TST.b   6(a4) ; Mask?
  18480.       BNE     PerfBlit2b_16SimpleReMapSkip10
  18481.       MOVE.b  6(a3),d2 ; Get dest
  18482.       MOVE.b  0(a0,d2.w),6(a3)
  18483. PerfBlit2b_16SimpleReMapSkip10
  18484.       TST.b   5(a4) ; Mask?
  18485.       BNE     PerfBlit2b_16SimpleReMapSkip11
  18486.       MOVE.b  5(a3),d1 ; Get dest
  18487.       MOVE.b  0(a0,d1.w),5(a3)
  18488. PerfBlit2b_16SimpleReMapSkip11
  18489.       TST.b   4(a4) ; Mask?
  18490.       BNE     PerfBlit2b_16SimpleReMapSkip12
  18491.       MOVE.b  4(a3),d2 ; Get dest
  18492.       MOVE.b  0(a0,d2.w),4(a3)
  18493. PerfBlit2b_16SimpleReMapSkip12
  18494.       MOVE.l  4(a4),d5
  18495.       OR.l    d5,-(a5)
  18496.       CMP.l   #-1,(a4)
  18497.       BEQ     PerfBlit2b_16SimpleReMapSkip16
  18498.       TST.b   3(a4) ; Mask?
  18499.       BNE     PerfBlit2b_16SimpleReMapSkip13
  18500.       MOVE.b  3(a3),d1 ; Get dest
  18501.       MOVE.b  0(a0,d1.w),3(a3)
  18502. PerfBlit2b_16SimpleReMapSkip13
  18503.       TST.b   2(a4) ; Mask?
  18504.       BNE     PerfBlit2b_16SimpleReMapSkip14
  18505.       MOVE.b  2(a3),d2 ; Get dest
  18506.       MOVE.b  0(a0,d2.w),2(a3)
  18507. PerfBlit2b_16SimpleReMapSkip14
  18508.       TST.b   1(a4) ; Mask?
  18509.       BNE     PerfBlit2b_16SimpleReMapSkip15
  18510.       MOVE.b  1(a3),d1 ; Get dest
  18511.       MOVE.b  0(a0,d1.w),1(a3)
  18512. PerfBlit2b_16SimpleReMapSkip15
  18513.       TST.b   (a4) ; Mask?
  18514.       BNE     PerfBlit2b_16SimpleReMapSkip16
  18515.       MOVE.b  (a3),d2 ; Get dest
  18516.       MOVE.b  0(a0,d2.w),0(a3)
  18517. PerfBlit2b_16SimpleReMapSkip16
  18518.       MOVE.l  (a4),d5
  18519.       OR.l    d5,-(a5)
  18520.       DBRA    d0,PerfBlit2b_16SimpleReMapXLoop
  18521.     SUB.w d7,a3
  18522.     SUB.w d6,a4
  18523.     SUB.w d7,a5
  18524.     DBRA  d4,PerfBlit2b_16SimpleReMapYLoop
  18525.   RTS
  18526. PerfBlit2b_16_Add
  18527.   MOVE.w  d3,a0
  18528. PerfBlit2b_16AddYLoop
  18529.     MOVE.w  a0,d0 ; XLoop
  18530. PerfBlit2b_16AddXLoop
  18531.       MOVE.l  -(a2),d1 ; Get source data
  18532.       MOVE.l  -(a4),d3 ; Get source stencil
  18533.       MOVE.l  -(a2),d2 ; Get source data
  18534.       MOVE.l  -(a4),d5 ; Get source stencil
  18535.       ADD.b   d1,-(a3) ; Add to dest
  18536.       LSR.w   #8,d1
  18537.       ADD.b   d1,-(a3) ; Add to dest
  18538.       SWAP    d1
  18539.       ADD.b   d1,-(a3) ; Add to dest
  18540.       LSR.w   #8,d1
  18541.       ADD.b   d1,-(a3) ; Add to dest
  18542.       AND.l   d3,-(a5) ; Write stencil
  18543.       ADD.b   d2,-(a3) ; Add to dest
  18544.       AND.l   d5,-(a5) ; Write stencil
  18545.       LSR.w   #8,d2
  18546.       ADD.b   d2,-(a3) ; Add to dest
  18547.       SWAP    d2
  18548.       ADD.b   d2,-(a3) ; Add to dest
  18549.       LSR.w   #8,d2
  18550.       ADD.b   d2,-(a3) ; Add to dest
  18551.       MOVE.l  -(a2),d1 ; Get source data
  18552.       MOVE.l  -(a4),d3 ; Get source stencil
  18553.       MOVE.l  -(a2),d2 ; Get source data
  18554.       MOVE.l  -(a4),d5 ; Get source stencil
  18555.       ADD.b   d1,-(a3) ; Add to dest
  18556.       LSR.w   #8,d1
  18557.       ADD.b   d1,-(a3) ; Add to dest
  18558.       SWAP    d1
  18559.       ADD.b   d1,-(a3) ; Add to dest
  18560.       LSR.w   #8,d1
  18561.       ADD.b   d1,-(a3) ; Add to dest
  18562.       AND.l   d3,-(a5) ; Write stencil
  18563.       ADD.b   d2,-(a3) ; Add to dest
  18564.       AND.l   d5,-(a5) ; Write stencil
  18565.       LSR.w   #8,d2
  18566.       ADD.b   d2,-(a3) ; Add to dest
  18567.       SWAP    d2
  18568.       ADD.b   d2,-(a3) ; Add to dest
  18569.       LSR.w   #8,d2
  18570.       ADD.b   d2,-(a3) ; Add to dest
  18571.       DBRA    d0,PerfBlit2b_16AddXLoop
  18572.     SUB.w d6,a2
  18573.     SUB.w d6,a4
  18574.     SUB.w d7,a3
  18575.     SUB.w d7,a5
  18576.     DBRA  d4,PerfBlit2b_16AddYLoop
  18577.   RTS
  18578. PerfBlit2b_16Check5
  18579.   ; Next check
  18580.   RTS
  18581.  
  18582. PerformBlit3
  18583. ;Do a `Blit' stencilled-blit, width should be multiple of 4
  18584. ;Copies data using stencil for cookie-cut and cuts image behind dest stencil
  18585. ;d0=BlitModeType
  18586. ;d3=Operation width
  18587. ;d4=Operation height
  18588. ;d6=Source linemodulo
  18589. ;d7=Dest linemodulo
  18590. ;a2=Source data address
  18591. ;a3=Dest data address
  18592. ;a4=Source stencil address
  18593. ;a5=Dest stencil address
  18594. ;Trashes many
  18595.   MOVE.b  d3,d5 ; Copy Width
  18596.   AND.b   #$0F,d5 ; Width multiple of 16?
  18597.   BEQ     PerformBlit3_16
  18598.   LSR.w   #2,d3 ; Width/4 for longwords
  18599.   SUBQ.w  #1,d3 ; XLoopcounter
  18600.   SUBQ.w  #1,d4 ; YLoopcounter
  18601.   CMP.b   #1,d0 ; What type of blit?
  18602.   BEQ     PerfBlit3EraseYLoop
  18603.   BGT     PerfBlit3Check2
  18604.   MOVE.w  d3,a0
  18605. PerfBlit3CookieYLoop
  18606.     MOVE.w  a0,d0 ; XLoop
  18607. PerfBlit3CookieXLoop
  18608.       MOVE.l  (a5)+,d2 ; Get dest stencil
  18609.       MOVE.l  (a4)+,d1 ; Get source stencil
  18610.       NOT.l   d2 ; Inverse dest stencil
  18611.       MOVE.l  (a3),d5 ; Get dest data
  18612.       OR.l    d2,d1 ; Combine stencils
  18613.       MOVE.l  (a2)+,d3 ; Get source data
  18614.       AND.l   d1,d5 ; And with dest
  18615.       NOT.l   d2 ; Inverse mask
  18616.       AND.l   d2,d3 ; And with source
  18617.       OR.l    d3,d5 ; Combine
  18618.       MOVE.l  d5,(a3)+ ; Write
  18619.       DBRA    d0,PerfBlit3CookieXLoop
  18620.     ADD.w d6,a2
  18621.     ADD.w d6,a4
  18622.     ADD.w d7,a3
  18623.     ADD.w d7,a5
  18624.     DBRA  d4,PerfBlit3CookieYLoop
  18625.   RTS
  18626. PerfBlit3EraseYLoop
  18627.     MOVE.w  d3,d0 ; XLoop
  18628. PerfBlit3EraseXLoop
  18629.       MOVE.l  (a5)+,d2 ; Get dest stencil
  18630.       NOT.l   d2 ; Inverse dest stencil
  18631.       OR.l    (a4)+,d2 ; Combine stencils
  18632.       AND.l   d2,(a3)+ ; And with dest
  18633.       DBRA    d0,PerfBlit3EraseXLoop
  18634.     ADD.w d6,a4
  18635.     ADD.w d7,a3
  18636.     ADD.w d7,a5
  18637.     DBRA  d4,PerfBlit3EraseYLoop
  18638.   RTS
  18639. PerfBlit3Check2 ; Do more type tests
  18640.   CMP.b   #3,d0 ; What type of blit?
  18641.   BEQ     PerfBlit3SolidYLoop
  18642.   BGT     PerfBlit3Check3
  18643. PerfBlit3InvYLoop
  18644.     MOVE.w  d3,d0 ; XLoop
  18645. PerfBlit3InvXLoop
  18646.       MOVE.l  (a4)+,d1 ; Get source stencil
  18647.       NOT.l   d1 ; Inverse mask
  18648.       AND.l   (a5)+,d1 ; Combine stencils
  18649.       EOR.l   d1,(a3)+ ; Eor with dest
  18650.       DBRA    d0,PerfBlit3InvXLoop
  18651.     ADD.w d6,a4
  18652.     ADD.w d7,a3
  18653.     ADD.w d7,a5
  18654.     DBRA  d4,PerfBlit3InvYLoop
  18655.   RTS
  18656. PerfBlit3SolidYLoop
  18657.     MOVE.w  d3,d0 ; XLoop
  18658. PerfBlit3SolidXLoop
  18659.       MOVE.l  (a4)+,d1 ; Get source stencil
  18660.       NOT.l   d1 ; Inverse mask
  18661.       AND.l   (a5)+,d1 ; Combine stencils
  18662.       NOT.l   d1 ; Inverse mask
  18663.       AND.l   d1,(a3)+ ; Or with dest
  18664.       DBRA    d0,PerfBlit3SolidXLoop
  18665.     ADD.w d6,a4
  18666.     ADD.w d7,a3
  18667.     ADD.w d7,a5
  18668.     DBRA  d4,PerfBlit3SolidYLoop
  18669.   RTS
  18670. PerfBlit3Check3
  18671.   CMP.b   #5,d0 ; What type of blit?
  18672.   BEQ     PerfBlit3Re_Map
  18673.   BGT     PerfBlit3Check4
  18674.   MOVE.b  CurrentInk1,d5
  18675.   MOVE.b  d5,d1
  18676.   LSL.w   #8,d5
  18677.   MOVE.b  d1,d5
  18678.   MOVE.w  d5,d1
  18679.   SWAP    d5
  18680.   MOVE.w  d1,d5
  18681.   MOVE.l  a6,-(a7) ; Store
  18682.   MOVE.w  d3,a6
  18683.   MOVE.w  d6,a2
  18684.   MOVE.w  d7,a1
  18685. PerfBlit3ColourYLoop
  18686.     MOVE.w  a6,d0 ; XLoop
  18687. PerfBlit3ColourXLoop
  18688.       MOVE.l  (a5)+,d2 ; Get dest stencil
  18689.       MOVE.l  (a4)+,d1 ; Get source stencil
  18690.       NOT.l   d2 ; Inverse dest stencil
  18691.       MOVE.l  d1,d7 ; Copy
  18692.       MOVE.l  (a3),d6 ; Get dest data
  18693.       OR.l    d2,d1 ; Combine stencils
  18694.       AND.l   d1,d6 ; And with dest
  18695.       MOVE.l  d5,d1 ; Get source data
  18696.       NOT.l   d2 ; Inverse mask
  18697.       NOT.l   d7 ; Inverse
  18698.       AND.l   d2,d1 ; And with source
  18699.       AND.l   d7,d1 ; And sourcemask
  18700.       OR.l    d1,d6 ; Combine
  18701.       MOVE.l  d6,(a3)+ ; Write
  18702.       DBRA    d0,PerfBlit3ColourXLoop
  18703.     ADD.w   a2,a4
  18704.     ADD.w   a1,a3
  18705.     ADD.w   a1,a5
  18706.     DBRA    d4,PerfBlit3ColourYLoop
  18707.   MOVE.l  (a7)+,a6 ; Restore
  18708.   RTS
  18709. PerfBlit3Re_Map
  18710.   MOVE.w  CurrentChunkyTable1,d0
  18711.   !GetTableObjectPtr ; table base in a0
  18712.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0
  18713.   MOVE.w  d3,a1
  18714.   MOVEQ.l #0,d1
  18715.   MOVEQ.l #0,d2
  18716.   MOVEQ.l #0,d3
  18717.   MOVEQ.l #0,d5
  18718.   MOVE.w  d6,a4
  18719. PerfBlit3ReMapYLoop
  18720.     MOVE.w  a1,d0 ; XLoop
  18721. PerfBlit3ReMapXLoop
  18722.       MOVE.b  (a2)+,d1 ; Get data
  18723.       MOVEQ.l #0,d3
  18724.       MOVE.b  (a2)+,d2 ; Get data
  18725.       LSL.w   #8,d1
  18726.       MOVE.b  (a2)+,d3 ; Get data
  18727.       LSL.w   #8,d2
  18728.       MOVE.b  (a2)+,d5 ; Get data
  18729.       LSL.w   #8,d3
  18730.       MOVE.l  (a3),d6
  18731.       MOVE.b  (a3),d1
  18732.       LSL.w   #8,d5
  18733.       MOVE.b  1(a3),d2
  18734.       MOVE.b  2(a3),d3
  18735.       MOVE.b  d6,d5
  18736.       MOVE.b  0(a0,d3.l),d3
  18737.       SWAP    d3
  18738.       MOVE.b  0(a0,d1.l),d3
  18739.       LSL.l   #8,d3
  18740.       MOVE.l  (a5)+,d1
  18741.       MOVE.b  0(a0,d2.l),d3
  18742.       SWAP    d3
  18743.       MOVE.b  0(a0,d5.l),d3
  18744.       AND.l   d1,d3
  18745.       NOT.l   d1
  18746.       AND.l   d1,d6
  18747.       OR.l    d6,d3
  18748.       MOVE.l  d3,(a3)+
  18749.       MOVEQ.l #0,d1
  18750.       DBRA    d0,PerfBlit3ReMapXLoop
  18751.     ADD.w a4,a2
  18752.     ADD.w d7,a3
  18753.     ADD.w d7,a5
  18754.     DBRA  d4,PerfBlit3ReMapYLoop
  18755.   RTS
  18756. PerfBlit3Check4
  18757.   CMP.b   #7,d0 ; What type of blit?
  18758.   BEQ     PerfBlit3_Add
  18759.   BGT     PerfBlit3Check5
  18760. PerfBlit3SimpleReMap
  18761.   MOVE.w  CurrentChunkyTable1,d0
  18762.   !GetTableObjectPtr ; table base in a0
  18763.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0
  18764.   MOVEQ.l #0,d1
  18765.   MOVEQ.l #0,d2
  18766.   MOVEQ.l #4,d5
  18767. PerfBlit3SimpleReMapYLoop
  18768.     MOVE.w  d3,d0 ; XLoop
  18769. PerfBlit3SimpleReMapXLoop
  18770.       TST.b   (a4)+ ; Mask?
  18771.       BNE     PerfBlit3SimpleReMapSkip1
  18772.       TST.b   (a5) ; Stencil?
  18773.       BEQ     PerfBlit3SimpleReMapSkip1
  18774.       MOVE.b  (a3),d1 ; Get dest
  18775.       MOVE.b  0(a0,d1.w),(a3)
  18776. PerfBlit3SimpleReMapSkip1
  18777.       TST.b   (a4)+ ; Mask?
  18778.       BNE     PerfBlit3SimpleReMapSkip2
  18779.       TST.b   1(a5) ; Stencil?
  18780.       BEQ     PerfBlit3SimpleReMapSkip2
  18781.       MOVE.b  1(a3),d2 ; Get dest
  18782.       MOVE.b  0(a0,d2.w),1(a3)
  18783. PerfBlit3SimpleReMapSkip2
  18784.       TST.b   (a4)+ ; Mask?
  18785.       BNE     PerfBlit3SimpleReMapSkip3
  18786.       TST.b   2(a5) ; Stencil?
  18787.       BEQ     PerfBlit3SimpleReMapSkip3
  18788.       MOVE.b  2(a3),d1 ; Get dest
  18789.       MOVE.b  0(a0,d1.w),2(a3)
  18790. PerfBlit3SimpleReMapSkip3
  18791.       TST.b   (a4)+ ; Mask?
  18792.       BNE     PerfBlit3SimpleReMapSkip4
  18793.       TST.b   3(a5) ; Stencil?
  18794.       BEQ     PerfBlit3SimpleReMapSkip4
  18795.       MOVE.b  3(a3),d2 ; Get dest
  18796.       MOVE.b  0(a0,d2.w),3(a3)
  18797. PerfBlit3SimpleReMapSkip4
  18798.       ADD.w   d5,a3
  18799.       ADD.w   d5,a5
  18800.       DBRA    d0,PerfBlit3SimpleReMapXLoop
  18801.     ADD.w d7,a3
  18802.     ADD.w d6,a4
  18803.     ADD.w d7,a5
  18804.     DBRA  d4,PerfBlit3SimpleReMapYLoop
  18805.   RTS
  18806. PerfBlit3_Add
  18807.   MOVEQ.l #4,d2 ; adder
  18808. PerfBlit3AddYLoop
  18809.     MOVE.w  d3,d0 ; XLoop
  18810. PerfBlit3AddXLoop
  18811.       MOVE.l  (a2)+,d1 ; Get source data
  18812.       TST.b   (a5)+ ; Change byte?
  18813.       BEQ     PerfBlit3AddSkip1
  18814.       ADD.b   d1,3(a3) ; Add to dest
  18815. PerfBlit3AddSkip1
  18816.       LSR.w   #8,d1
  18817.       TST.b   (a5)+ ; Change byte?
  18818.       BEQ     PerfBlit3AddSkip2
  18819.       ADD.b   d1,2(a3) ; Add to dest
  18820. PerfBlit3AddSkip2
  18821.       SWAP    d1
  18822.       TST.b   (a5)+ ; Change byte?
  18823.       BEQ     PerfBlit3AddSkip3
  18824.       ADD.b   d1,1(a3) ; Add to dest
  18825. PerfBlit3AddSkip3
  18826.       LSR.w   #8,d1
  18827.       TST.b   (a5)+ ; Change byte?
  18828.       BEQ     PerfBlit3AddSkip4
  18829.       ADD.b   d1,0(a3) ; Add to dest
  18830. PerfBlit3AddSkip4
  18831.       ADD.l   d2,a3 ; Skip 4
  18832.       DBRA    d0,PerfBlit3AddXLoop
  18833.     ADD.w d6,a2
  18834.     ADD.w d7,a3
  18835.     ADD.w d7,a5
  18836.     DBRA  d4,PerfBlit3AddYLoop
  18837.   RTS
  18838. PerfBlit3Check5
  18839.   ; Next check
  18840.   RTS
  18841.  
  18842. PerformBlit3b
  18843. ;Do a `Blit' stencilled-blit, width should be multiple of 4, backwards
  18844. ;Copies data backwards using stencil for cookie-cut and cuts image behind dest stencil
  18845. ;d0=BlitModeType
  18846. ;d3=Operation width
  18847. ;d4=Operation height
  18848. ;d6=Source linemodulo
  18849. ;d7=Dest linemodulo
  18850. ;a2=Source data address
  18851. ;a3=Dest data address
  18852. ;a4=Source stencil address
  18853. ;a5=Dest stencil address
  18854. ;Trashes many
  18855.   MOVE.b  d3,d5 ; Copy Width
  18856.   AND.b   #$0F,d5 ; Width multiple of 16?
  18857.   BEQ     PerformBlit3b_16
  18858.   MOVE.w  d3,d5 ; Get Width
  18859.   ADD.w   d6,d5 ; Add source linemod
  18860.   MULU    d4,d5 ; Total bytes
  18861.   SUB.l   d6,d5 ; -Linemod of last line
  18862.   ADD.l   d5,a2 ; Add to source address
  18863.   ADD.l   d5,a4 ; Add to source stencil address
  18864.   MOVE.w  d3,d5 ; Get Width
  18865.   ADD.w   d7,d5 ; Add dest linemod
  18866.   MULU    d4,d5 ; Total bytes
  18867.   SUB.l   d7,d5 ; -Linemod of last line
  18868.   ADD.l   d5,a3 ; Add to dest address
  18869.   ADD.l   d5,a5 ; Add to dest stencil address
  18870.   LSR.w   #2,d3 ; Width/4 for longwords
  18871.   SUBQ.w  #1,d3 ; XLoopcounter
  18872.   SUBQ.w  #1,d4 ; YLoopcounter
  18873.   CMP.b   #1,d0 ; What type of blit?
  18874.   BEQ     PerfBlit3bEraseYLoop
  18875.   BGT     PerfBlit3bCheck2
  18876.   MOVE.w  d3,a0
  18877. PerfBlit3bCookieYLoop
  18878.     MOVE.w  a0,d0 ; XLoop
  18879. PerfBlit3bCookieXLoop
  18880.       MOVE.l  -(a5),d2 ; Get dest stencil
  18881.       MOVE.l  -(a4),d1 ; Get source stencil
  18882.       NOT.l   d2 ; Inverse dest stencil
  18883.       MOVE.l  -(a3),d5 ; Get dest data
  18884.       OR.l    d2,d1 ; Combine stencils
  18885.       MOVE.l  -(a2),d3 ; Get source data
  18886.       AND.l   d1,d5 ; And with dest
  18887.       NOT.l   d2 ; Inverse mask
  18888.       AND.l   d2,d3 ; And with source
  18889.       OR.l    d3,d5 ; Combine
  18890.       MOVE.l  d5,(a3) ; Write
  18891.       DBRA    d0,PerfBlit3bCookieXLoop
  18892.     SUB.w d6,a2
  18893.     SUB.w d6,a4
  18894.     SUB.w d7,a3
  18895.     SUB.w d7,a5
  18896.     DBRA  d4,PerfBlit3bCookieYLoop
  18897.   RTS
  18898. PerfBlit3bEraseYLoop
  18899.     MOVE.w  d3,d0 ; XLoop
  18900. PerfBlit3bEraseXLoop
  18901.       MOVE.l  -(a5),d2 ; Get dest stencil
  18902.       NOT.l   d2 ; Inverse dest stencil
  18903.       OR.l    -(a4),d2 ; Combine stencils
  18904.       AND.l   d2,-(a3) ; And with dest
  18905.       DBRA    d0,PerfBlit3bEraseXLoop
  18906.     SUB.w d6,a4
  18907.     SUB.w d7,a3
  18908.     SUB.w d7,a5
  18909.     DBRA  d4,PerfBlit3bEraseYLoop
  18910.   RTS
  18911. PerfBlit3bCheck2 ; Do more type tests
  18912.   CMP.b   #3,d0 ; What type of blit?
  18913.   BEQ     PerfBlit3bSolidYLoop
  18914.   BGT     PerfBlit3bCheck3
  18915. PerfBlit3bInvYLoop
  18916.     MOVE.w  d3,d0 ; XLoop
  18917. PerfBlit3bInvXLoop
  18918.       MOVE.l  -(a4),d1 ; Get source stencil
  18919.       NOT.l   d1 ; Inverse mask
  18920.       AND.l   -(a5),d1 ; Combine stencils
  18921.       EOR.l   d1,-(a3) ; Eor with dest
  18922.       DBRA    d0,PerfBlit3bInvXLoop
  18923.     SUB.w d6,a4
  18924.     SUB.w d7,a3
  18925.     SUB.w d7,a5
  18926.     DBRA  d4,PerfBlit3bInvYLoop
  18927.   RTS
  18928. PerfBlit3bSolidYLoop
  18929.     MOVE.w  d3,d0 ; XLoop
  18930. PerfBlit3bSolidXLoop
  18931.       MOVE.l  -(a4),d1 ; Get source stencil
  18932.       NOT.l   d1 ; Inverse mask
  18933.       AND.l   -(a5),d1 ; Combine stencils
  18934.       NOT.l   d1 ; Inverse mask
  18935.       AND.l   d1,-(a3) ; Or with dest
  18936.       DBRA    d0,PerfBlit3bSolidXLoop
  18937.     SUB.w d6,a4
  18938.     SUB.w d7,a3
  18939.     SUB.w d7,a5
  18940.     DBRA  d4,PerfBlit3bSolidYLoop
  18941.   RTS
  18942. PerfBlit3bCheck3
  18943.   CMP.b   #5,d0 ; What type of blit?
  18944.   BEQ     PerfBlit3bRe_Map
  18945.   BGT     PerfBlit3bCheck4
  18946.   MOVE.b  CurrentInk1,d5
  18947.   MOVE.b  d5,d1
  18948.   LSL.w   #8,d5
  18949.   MOVE.b  d1,d5
  18950.   MOVE.w  d5,d1
  18951.   SWAP    d5
  18952.   MOVE.w  d1,d5
  18953.   MOVE.l  a6,-(a7) ; Store
  18954.   MOVE.w  d3,a6
  18955.   MOVE.w  d6,a2
  18956.   MOVE.w  d7,a1
  18957. PerfBlit3bColourYLoop
  18958.     MOVE.w  a6,d0 ; XLoop
  18959. PerfBlit3bColourXLoop
  18960.       MOVE.l  -(a5),d2 ; Get dest stencil
  18961.       MOVE.l  -(a4),d1 ; Get source stencil
  18962.       NOT.l   d2 ; Inverse dest stencil
  18963.       MOVE.l  d1,d7 ; Copy
  18964.       MOVE.l  -(a3),d6 ; Get dest data
  18965.       OR.l    d2,d1 ; Combine stencils
  18966.       AND.l   d1,d6 ; And with dest
  18967.       MOVE.l  d5,d1 ; Get source data
  18968.       NOT.l   d2 ; Inverse mask
  18969.       NOT.l   d7 ; Inverse
  18970.       AND.l   d2,d1 ; And with source
  18971.       AND.l   d7,d1 ; And sourcemask
  18972.       OR.l    d1,d6 ; Combine
  18973.       MOVE.l  d6,(a3) ; Write
  18974.       DBRA    d0,PerfBlit3bColourXLoop
  18975.     SUB.w   a2,a4
  18976.     SUB.w   a1,a3
  18977.     SUB.w   a1,a5
  18978.     DBRA    d4,PerfBlit3bColourYLoop
  18979.   MOVE.l  (a7)+,a6 ; Restore
  18980.   RTS
  18981. PerfBlit3bRe_Map
  18982.   MOVE.w  CurrentChunkyTable1,d0
  18983.   !GetTableObjectPtr ; table base in a0
  18984.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0
  18985.   MOVE.w  d3,a1
  18986.   MOVEQ.l #0,d1
  18987.   MOVEQ.l #0,d2
  18988.   MOVEQ.l #0,d3
  18989.   MOVEQ.l #0,d5
  18990.   MOVE.w  d6,a4
  18991. PerfBlit3bReMapYLoop
  18992.     MOVE.w  a1,d0 ; XLoop
  18993. PerfBlit3bReMapXLoop
  18994.       MOVE.b  -(a2),d1 ; Get data
  18995.       MOVEQ.l #0,d3
  18996.       MOVE.b  -(a2),d2 ; Get data
  18997.       LSL.w   #8,d1
  18998.       MOVE.b  -(a2),d3 ; Get data
  18999.       LSL.w   #8,d2
  19000.       MOVE.b  -(a2),d5 ; Get data
  19001.       LSL.w   #8,d3
  19002.       MOVE.l  -(a3),d6
  19003.       MOVE.b  3(a3),d1
  19004.       LSL.w   #8,d5
  19005.       MOVE.b  2(a3),d2
  19006.       MOVE.b  1(a3),d3
  19007.       MOVE.b  (a3),d5
  19008.       MOVE.b  0(a0,d2.l),d2
  19009.       SWAP    d2
  19010.       MOVE.b  0(a0,d5.l),d2
  19011.       LSL.l   #8,d2
  19012.       MOVE.l  -(a5),d1
  19013.       MOVE.b  0(a0,d3.l),d2
  19014.       SWAP    d2
  19015.       MOVE.b  0(a0,d1.l),d2
  19016.       AND.l   d1,d2
  19017.       NOT.l   d1
  19018.       AND.l   d1,d6
  19019.       OR.l    d6,d2
  19020.       MOVE.l  d2,(a3)
  19021.       MOVEQ.l #0,d1
  19022.       DBRA    d0,PerfBlit3bReMapXLoop
  19023.     SUB.w a4,a2
  19024.     SUB.w d7,a3
  19025.     SUB.w d7,a5
  19026.     DBRA  d4,PerfBlit3bReMapYLoop
  19027.   RTS
  19028. PerfBlit3bCheck4
  19029.   CMP.b   #7,d0 ; What type of blit?
  19030.   BEQ     PerfBlit3b_Add
  19031.   BGT     PerfBlit3bCheck5
  19032. PerfBlit3bSimpleReMap
  19033.   MOVE.w  CurrentChunkyTable1,d0
  19034.   !GetTableObjectPtr ; table base in a0
  19035.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0
  19036.   MOVEQ.l #0,d1
  19037.   MOVEQ.l #0,d2
  19038.   MOVEQ.l #4,d5
  19039. PerfBlit3bSimpleReMapYLoop
  19040.     MOVE.w  d3,d0 ; XLoop
  19041. PerfBlit3bSimpleReMapXLoop
  19042.       SUB.w   d5,a3
  19043.       SUB.w   d5,a5
  19044.       TST.b   -(a4) ; Mask?
  19045.       BNE     PerfBlit3bSimpleReMapSkip1
  19046.       TST.b   3(a5) ; Stencil?
  19047.       BEQ     PerfBlit3bSimpleReMapSkip1
  19048.       MOVE.b  3(a3),d1 ; Get dest
  19049.       MOVE.b  0(a0,d1.w),3(a3)
  19050. PerfBlit3bSimpleReMapSkip1
  19051.       TST.b   -(a4) ; Mask?
  19052.       BNE     PerfBlit3bSimpleReMapSkip2
  19053.       TST.b   2(a5) ; Stencil?
  19054.       BEQ     PerfBlit3bSimpleReMapSkip2
  19055.       MOVE.b  2(a3),d2 ; Get dest
  19056.       MOVE.b  0(a0,d2.w),2(a3)
  19057. PerfBlit3bSimpleReMapSkip2
  19058.       TST.b   -(a4) ; Mask?
  19059.       BNE     PerfBlit3bSimpleReMapSkip3
  19060.       TST.b   1(a5) ; Stencil?
  19061.       BEQ     PerfBlit3bSimpleReMapSkip3
  19062.       MOVE.b  1(a3),d1 ; Get dest
  19063.       MOVE.b  0(a0,d1.w),1(a3)
  19064. PerfBlit3bSimpleReMapSkip3
  19065.       TST.b   -(a4) ; Mask?
  19066.       BNE     PerfBlit3bSimpleReMapSkip4
  19067.       TST.b   (a5) ; Stencil?
  19068.       BEQ     PerfBlit3bSimpleReMapSkip4
  19069.       MOVE.b  (a3),d2 ; Get dest
  19070.       MOVE.b  0(a0,d2.w),(a3)
  19071. PerfBlit3bSimpleReMapSkip4
  19072.       DBRA    d0,PerfBlit3bSimpleReMapXLoop
  19073.     SUB.w d7,a3
  19074.     SUB.w d6,a4
  19075.     SUB.w d7,a5
  19076.     DBRA  d4,PerfBlit3bSimpleReMapYLoop
  19077.   RTS
  19078. PerfBlit3b_Add
  19079.   MOVEQ.l #4,d2 ; adder
  19080. PerfBlit3bAddYLoop
  19081.     MOVE.w  d3,d0 ; XLoop
  19082. PerfBlit3bAddXLoop
  19083.       SUB.l   d2,a3 ; Skip 4
  19084.       MOVE.l  -(a2),d1 ; Get source data
  19085.       TST.b   -(a5) ; Change byte?
  19086.       BEQ     PerfBlit3bAddSkip1
  19087.       ADD.b   d1,3(a3) ; Add to dest
  19088. PerfBlit3bAddSkip1
  19089.       LSR.w   #8,d1
  19090.       TST.b   -(a5) ; Change byte?
  19091.       BEQ     PerfBlit3bAddSkip2
  19092.       ADD.b   d1,2(a3) ; Add to dest
  19093. PerfBlit3bAddSkip2
  19094.       SWAP    d1
  19095.       TST.b   -(a5) ; Change byte?
  19096.       BEQ     PerfBlit3bAddSkip3
  19097.       ADD.b   d1,1(a3) ; Add to dest
  19098. PerfBlit3bAddSkip3
  19099.       LSR.w   #8,d1
  19100.       TST.b   -(a5) ; Change byte?
  19101.       BEQ     PerfBlit3bAddSkip4
  19102.       ADD.b   d1,(a3) ; Add to dest
  19103. PerfBlit3bAddSkip4
  19104.       DBRA    d0,PerfBlit3bAddXLoop
  19105.     SUB.w d6,a2
  19106.     SUB.w d7,a3
  19107.     SUB.w d7,a5
  19108.     DBRA  d4,PerfBlit3bAddYLoop
  19109.   RTS
  19110. PerfBlit3bCheck5
  19111.   ; Next check
  19112.   RTS
  19113.  
  19114. PerformBlit3_16
  19115. ;Do a `Blit' stencilled-blit, width should be multiple of 16. Addresses dont need to be aligned
  19116. ;Copies data using stencil for cookie-cut and cuts image behind dest stencil
  19117. ;d0=BlitModeType
  19118. ;d3=Operation width
  19119. ;d4=Operation height
  19120. ;d6=Source linemodulo
  19121. ;d7=Dest linemodulo
  19122. ;a2=Source data address
  19123. ;a3=Dest data address
  19124. ;a4=Source stencil address
  19125. ;a5=Dest stencil address
  19126. ;Trashes many
  19127.   LSR.w   #4,d3 ; Width/16 for groups of 4 longwords
  19128.   SUBQ.w  #1,d3 ; XLoopcounter
  19129.   SUBQ.w  #1,d4 ; YLoopcounter
  19130.   CMP.b   #1,d0 ; What type of blit?
  19131.   BEQ     PerfBlit3_16_Erase
  19132.   BGT     PerfBlit3_16Check2
  19133.   MOVE.w  d3,a0
  19134.   MOVE.l  a6,-(a7) ; Store
  19135.   MOVE.w  d6,a1
  19136.   MOVE.w  d7,a6
  19137. PerfBlit3_16CookieYLoop
  19138.     MOVE.w  a0,d0 ; XLoop
  19139. PerfBlit3_16CookieXLoop
  19140.       MOVE.l  (a5)+,d2 ; Get dest stencil
  19141.       MOVE.l  (a5)+,d7 ; Get dest stencil
  19142.       NOT.l   d2 ; Inverse dest stencil
  19143.       MOVE.l  (a4)+,d1 ; Get source stencil
  19144.       NOT.l   d7 ; Inverse dest stencil
  19145.       MOVE.l  (a4)+,d6 ; Get source stencil
  19146.       OR.l    d2,d1 ; Combine stencils
  19147.       MOVE.l  (a3),d3 ; Get dest data
  19148.       OR.l    d7,d6 ; Combine stencils
  19149.       MOVE.l  4(a3),d5 ; Get dest data
  19150.       AND.l   d1,d3 ; And with dest
  19151.       AND.l   d6,d5 ; And with dest
  19152.       NOT.l   d2 ; Inverse mask
  19153.       MOVE.l  (a2)+,d1 ; Get source data
  19154.       NOT.l   d7 ; Inverse mask
  19155.       MOVE.l  (a2)+,d6 ; Get source data
  19156.       AND.l   d2,d1 ; And with source
  19157.       AND.l   d7,d6 ; And with source
  19158.       OR.l    d1,d3 ; Combine
  19159.       MOVE.l  d3,(a3)+ ; Write
  19160.       OR.l    d6,d5 ; Combine
  19161.       MOVE.l  d5,(a3)+ ; Write
  19162.       MOVE.l  (a5)+,d2 ; Get dest stencil
  19163.       MOVE.l  (a5)+,d7 ; Get dest stencil
  19164.       NOT.l   d2 ; Inverse dest stencil
  19165.       MOVE.l  (a4)+,d1 ; Get source stencil
  19166.       NOT.l   d7 ; Inverse dest stencil
  19167.       MOVE.l  (a4)+,d6 ; Get source stencil
  19168.       OR.l    d2,d1 ; Combine stencils
  19169.       MOVE.l  (a3),d3 ; Get dest data
  19170.       OR.l    d7,d6 ; Combine stencils
  19171.       MOVE.l  4(a3),d5 ; Get dest data
  19172.       AND.l   d1,d3 ; And with dest
  19173.       AND.l   d6,d5 ; And with dest
  19174.       NOT.l   d2 ; Inverse mask
  19175.       MOVE.l  (a2)+,d1 ; Get source data
  19176.       NOT.l   d7 ; Inverse mask
  19177.       MOVE.l  (a2)+,d6 ; Get source data
  19178.       AND.l   d2,d1 ; And with source
  19179.       AND.l   d7,d6 ; And with source
  19180.       OR.l    d1,d3 ; Combine
  19181.       MOVE.l  d3,(a3)+ ; Write
  19182.       OR.l    d6,d5 ; Combine
  19183.       MOVE.l  d5,(a3)+ ; Write
  19184.       DBRA    d0,PerfBlit3_16CookieXLoop
  19185.     ADD.w a1,a2
  19186.     ADD.w a1,a4
  19187.     ADD.w a6,a3
  19188.     ADD.w a6,a5
  19189.     DBRA  d4,PerfBlit3_16CookieYLoop
  19190.   MOVE.l  (a7)+,a6 ; Restore
  19191.   RTS
  19192. PerfBlit3_16_Erase
  19193.   MOVE.w  d3,a0
  19194. PerfBlit3_16EraseYLoop
  19195.     MOVE.w  a0,d0 ; XLoop
  19196. PerfBlit3_16EraseXLoop
  19197.       MOVE.l  (a5)+,d1 ; Get dest stencil
  19198.       MOVE.l  (a5)+,d2
  19199.       NOT.l   d1 ; Inverse dest stencil
  19200.       MOVE.l  (a5)+,d3
  19201.       NOT.l   d2
  19202.       MOVE.l  (a5)+,d5
  19203.       NOT.l   d3
  19204.       OR.l    (a4)+,d1 ; Combine stencils
  19205.       NOT.l   d5
  19206.       OR.l    (a4)+,d2
  19207.       OR.l    (a4)+,d3
  19208.       OR.l    (a4)+,d5
  19209.       AND.l   d1,(a3)+ ; And with dest
  19210.       AND.l   d2,(a3)+
  19211.       AND.l   d3,(a3)+
  19212.       AND.l   d5,(a3)+
  19213.       DBRA    d0,PerfBlit3_16EraseXLoop
  19214.     ADD.w d6,a4
  19215.     ADD.w d7,a3
  19216.     ADD.w d7,a5
  19217.     DBRA  d4,PerfBlit3_16EraseYLoop
  19218.   RTS
  19219. PerfBlit3_16Check2 ; Do more type tests
  19220.   CMP.b   #3,d0 ; What type of blit?
  19221.   BEQ     PerfBlit3_16Solid
  19222.   BGT     PerfBlit3_16Check3
  19223.   MOVE.w  d3,a0
  19224. PerfBlit3_16InvYLoop
  19225.     MOVE.w  a0,d0 ; XLoop
  19226. PerfBlit3_16InvXLoop
  19227.       MOVE.l  (a4)+,d1 ; Get source stencil
  19228.       MOVE.l  (a4)+,d2
  19229.       NOT.l   d1 ; Inverse mask
  19230.       MOVE.l  (a4)+,d3
  19231.       NOT.l   d2
  19232.       MOVE.l  (a4)+,d5
  19233.       NOT.l   d3
  19234.       AND.l   (a5)+,d1 ; Combine stencils
  19235.       NOT.l   d5
  19236.       AND.l   (a5)+,d2
  19237.       AND.l   (a5)+,d3
  19238.       AND.l   (a5)+,d5
  19239.       EOR.l   d1,(a3)+ ; Eor with dest
  19240.       EOR.l   d2,(a3)+
  19241.       EOR.l   d3,(a3)+
  19242.       EOR.l   d5,(a3)+
  19243.       DBRA    d0,PerfBlit3_16InvXLoop
  19244.     ADD.w d6,a4
  19245.     ADD.w d7,a3
  19246.     ADD.w d7,a5
  19247.     DBRA  d4,PerfBlit3_16InvYLoop
  19248.   RTS
  19249. PerfBlit3_16Solid
  19250.   MOVE.w  d3,a0
  19251. PerfBlit3_16SolidYLoop
  19252.     MOVE.w  a0,d0 ; XLoop
  19253. PerfBlit3_16SolidXLoop
  19254.       MOVE.l  (a4)+,d1 ; Get source stencil
  19255.       MOVE.l  (a4)+,d2
  19256.       NOT.l   d1 ; Inverse mask
  19257.       MOVE.l  (a4)+,d3
  19258.       NOT.l   d2
  19259.       MOVE.l  (a4)+,d5
  19260.       NOT.l   d3
  19261.       AND.l   (a5)+,d1 ; Combine stencils
  19262.       NOT.l   d5
  19263.       AND.l   (a5)+,d2
  19264.       NOT.l   d1 ; Inverse mask
  19265.       AND.l   (a5)+,d3
  19266.       NOT.l   d2
  19267.       AND.l   (a5)+,d5
  19268.       NOT.l   d3
  19269.       AND.l   d1,(a3)+ ; Or with dest
  19270.       NOT.l   d5
  19271.       AND.l   d2,(a3)+
  19272.       AND.l   d3,(a3)+
  19273.       AND.l   d5,(a3)+
  19274.       DBRA    d0,PerfBlit3_16SolidXLoop
  19275.     ADD.w d6,a4
  19276.     ADD.w d7,a3
  19277.     ADD.w d7,a5
  19278.     DBRA  d4,PerfBlit3_16SolidYLoop
  19279.   RTS
  19280. PerfBlit3_16Check3
  19281.   CMP.b   #5,d0 ; What type of blit?
  19282.   BEQ     PerfBlit3_16Re_Map
  19283.   BGT     PerfBlit3_16Check4
  19284.   MOVE.b  CurrentInk1,d5
  19285.   MOVE.b  d5,d1
  19286.   LSL.w   #8,d5
  19287.   MOVE.b  d1,d5
  19288.   MOVE.w  d5,d1
  19289.   SWAP    d5
  19290.   MOVE.w  d1,d5
  19291.   MOVE.l  a6,-(a7) ; Store
  19292.   MOVE.w  d3,a6
  19293.   MOVE.w  d6,a2
  19294.   MOVE.w  d7,a1
  19295. PerfBlit3_16ColourYLoop
  19296.     MOVE.w  a6,d0 ; XLoop
  19297. PerfBlit3_16ColourXLoop
  19298.       MOVE.l  (a5)+,d2 ; Get dest stencil
  19299.       MOVE.l  (a4)+,d1 ; Get source stencil
  19300.       NOT.l   d2 ; Inverse dest stencil
  19301.       MOVE.l  d1,d7 ; Copy
  19302.       MOVE.l  (a3),d6 ; Get dest data
  19303.       OR.l    d2,d1 ; Combine stencils
  19304.       AND.l   d1,d6 ; And with dest
  19305.       MOVE.l  d5,d1 ; Get source data
  19306.       NOT.l   d2 ; Inverse mask
  19307.       NOT.l   d7 ; Inverse
  19308.       AND.l   d2,d1 ; And with source
  19309.       AND.l   d7,d1 ; And sourcemask
  19310.       OR.l    d1,d6 ; Combine
  19311.       MOVE.l  d6,(a3)+ ; Write
  19312.       MOVE.l  (a5)+,d2 ; Get dest stencil
  19313.       MOVE.l  (a4)+,d1 ; Get source stencil
  19314.       NOT.l   d2 ; Inverse dest stencil
  19315.       MOVE.l  d1,d7 ; Copy
  19316.       MOVE.l  (a3),d6 ; Get dest data
  19317.       OR.l    d2,d1 ; Combine stencils
  19318.       AND.l   d1,d6 ; And with dest
  19319.       MOVE.l  d5,d1 ; Get source data
  19320.       NOT.l   d2 ; Inverse mask
  19321.       NOT.l   d7 ; Inverse
  19322.       AND.l   d2,d1 ; And with source
  19323.       AND.l   d7,d1 ; And sourcemask
  19324.       OR.l    d1,d6 ; Combine
  19325.       MOVE.l  d6,(a3)+ ; Write
  19326.       MOVE.l  (a5)+,d2 ; Get dest stencil
  19327.       MOVE.l  (a4)+,d1 ; Get source stencil
  19328.       NOT.l   d2 ; Inverse dest stencil
  19329.       MOVE.l  d1,d7 ; Copy
  19330.       MOVE.l  (a3),d6 ; Get dest data
  19331.       OR.l    d2,d1 ; Combine stencils
  19332.       AND.l   d1,d6 ; And with dest
  19333.       MOVE.l  d5,d1 ; Get source data
  19334.       NOT.l   d2 ; Inverse mask
  19335.       NOT.l   d7 ; Inverse
  19336.       AND.l   d2,d1 ; And with source
  19337.       AND.l   d7,d1 ; And sourcemask
  19338.       OR.l    d1,d6 ; Combine
  19339.       MOVE.l  d6,(a3)+ ; Write
  19340.       MOVE.l  (a5)+,d2 ; Get dest stencil
  19341.       MOVE.l  (a4)+,d1 ; Get source stencil
  19342.       NOT.l   d2 ; Inverse dest stencil
  19343.       MOVE.l  d1,d7 ; Copy
  19344.       MOVE.l  (a3),d6 ; Get dest data
  19345.       OR.l    d2,d1 ; Combine stencils
  19346.       AND.l   d1,d6 ; And with dest
  19347.       MOVE.l  d5,d1 ; Get source data
  19348.       NOT.l   d2 ; Inverse mask
  19349.       NOT.l   d7 ; Inverse
  19350.       AND.l   d2,d1 ; And with source
  19351.       AND.l   d7,d1 ; And sourcemask
  19352.       OR.l    d1,d6 ; Combine
  19353.       MOVE.l  d6,(a3)+ ; Write
  19354.       DBRA    d0,PerfBlit3_16ColourXLoop
  19355.     ADD.w   a2,a4
  19356.     ADD.w   a1,a3
  19357.     ADD.w   a1,a5
  19358.     DBRA    d4,PerfBlit3_16ColourYLoop
  19359.   MOVE.l  (a7)+,a6 ; Restore
  19360.   RTS
  19361. PerfBlit3_16Re_Map
  19362.   MOVE.w  CurrentChunkyTable1,d0
  19363.   !GetTableObjectPtr ; table base in a0
  19364.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0
  19365.   MOVE.w  d3,a1
  19366.   MOVEQ.l #0,d1
  19367.   MOVEQ.l #0,d2
  19368.   MOVEQ.l #0,d3
  19369.   MOVEQ.l #0,d5
  19370.   MOVE.w  d6,a4
  19371. PerfBlit3_16ReMapYLoop
  19372.     MOVE.w  a1,d0 ; XLoop
  19373. PerfBlit3_16ReMapXLoop
  19374.       MOVE.b  (a2)+,d1 ; Get data
  19375.       MOVEQ.l #0,d3
  19376.       MOVE.b  (a2)+,d2 ; Get data
  19377.       LSL.w   #8,d1
  19378.       MOVE.b  (a2)+,d3 ; Get data
  19379.       LSL.w   #8,d2
  19380.       MOVE.b  (a2)+,d5 ; Get data
  19381.       LSL.w   #8,d3
  19382.       MOVE.l  (a3),d6
  19383.       MOVE.b  (a3),d1
  19384.       LSL.w   #8,d5
  19385.       MOVE.b  1(a3),d2
  19386.       MOVE.b  2(a3),d3
  19387.       MOVE.b  d6,d5
  19388.       MOVE.b  0(a0,d3.l),d3
  19389.       SWAP    d3
  19390.       MOVE.b  0(a0,d1.l),d3
  19391.       LSL.l   #8,d3
  19392.       MOVE.l  (a5)+,d1
  19393.       MOVE.b  0(a0,d2.l),d3
  19394.       SWAP    d3
  19395.       MOVE.b  0(a0,d5.l),d3
  19396.       AND.l   d1,d3
  19397.       NOT.l   d1
  19398.       AND.l   d1,d6
  19399.       OR.l    d6,d3
  19400.       MOVE.l  d3,(a3)+
  19401.       MOVEQ.l #0,d1
  19402.       MOVE.b  (a2)+,d1 ; Get data
  19403.       MOVEQ.l #0,d3
  19404.       MOVE.b  (a2)+,d2 ; Get data
  19405.       LSL.w   #8,d1
  19406.       MOVE.b  (a2)+,d3 ; Get data
  19407.       LSL.w   #8,d2
  19408.       MOVE.b  (a2)+,d5 ; Get data
  19409.       LSL.w   #8,d3
  19410.       MOVE.l  (a3),d6
  19411.       MOVE.b  (a3),d1
  19412.       LSL.w   #8,d5
  19413.       MOVE.b  1(a3),d2
  19414.       MOVE.b  2(a3),d3
  19415.       MOVE.b  d6,d5
  19416.       MOVE.b  0(a0,d3.l),d3
  19417.       SWAP    d3
  19418.       MOVE.b  0(a0,d1.l),d3
  19419.       LSL.l   #8,d3
  19420.       MOVE.l  (a5)+,d1
  19421.       MOVE.b  0(a0,d2.l),d3
  19422.       SWAP    d3
  19423.       MOVE.b  0(a0,d5.l),d3
  19424.       AND.l   d1,d3
  19425.       NOT.l   d1
  19426.       AND.l   d1,d6
  19427.       OR.l    d6,d3
  19428.       MOVE.l  d3,(a3)+
  19429.       MOVEQ.l #0,d1
  19430.       MOVE.b  (a2)+,d1 ; Get data
  19431.       MOVEQ.l #0,d3
  19432.       MOVE.b  (a2)+,d2 ; Get data
  19433.       LSL.w   #8,d1
  19434.       MOVE.b  (a2)+,d3 ; Get data
  19435.       LSL.w   #8,d2
  19436.       MOVE.b  (a2)+,d5 ; Get data
  19437.       LSL.w   #8,d3
  19438.       MOVE.l  (a3),d6
  19439.       MOVE.b  (a3),d1
  19440.       LSL.w   #8,d5
  19441.       MOVE.b  1(a3),d2
  19442.       MOVE.b  2(a3),d3
  19443.       MOVE.b  d6,d5
  19444.       MOVE.b  0(a0,d3.l),d3
  19445.       SWAP    d3
  19446.       MOVE.b  0(a0,d1.l),d3
  19447.       LSL.l   #8,d3
  19448.       MOVE.l  (a5)+,d1
  19449.       MOVE.b  0(a0,d2.l),d3
  19450.       SWAP    d3
  19451.       MOVE.b  0(a0,d5.l),d3
  19452.       AND.l   d1,d3
  19453.       NOT.l   d1
  19454.       AND.l   d1,d6
  19455.       OR.l    d6,d3
  19456.       MOVE.l  d3,(a3)+
  19457.       MOVEQ.l #0,d1
  19458.       MOVE.b  (a2)+,d1 ; Get data
  19459.       MOVEQ.l #0,d3
  19460.       MOVE.b  (a2)+,d2 ; Get data
  19461.       LSL.w   #8,d1
  19462.       MOVE.b  (a2)+,d3 ; Get data
  19463.       LSL.w   #8,d2
  19464.       MOVE.b  (a2)+,d5 ; Get data
  19465.       LSL.w   #8,d3
  19466.       MOVE.l  (a3),d6
  19467.       MOVE.b  (a3),d1
  19468.       LSL.w   #8,d5
  19469.       MOVE.b  1(a3),d2
  19470.       MOVE.b  2(a3),d3
  19471.       MOVE.b  d6,d5
  19472.       MOVE.b  0(a0,d3.l),d3
  19473.       SWAP    d3
  19474.       MOVE.b  0(a0,d1.l),d3
  19475.       LSL.l   #8,d3
  19476.       MOVE.l  (a5)+,d1
  19477.       MOVE.b  0(a0,d2.l),d3
  19478.       SWAP    d3
  19479.       MOVE.b  0(a0,d5.l),d3
  19480.       AND.l   d1,d3
  19481.       NOT.l   d1
  19482.       AND.l   d1,d6
  19483.       OR.l    d6,d3
  19484.       MOVE.l  d3,(a3)+
  19485.       MOVEQ.l #0,d1
  19486.       DBRA    d0,PerfBlit3_16ReMapXLoop
  19487.     ADD.w a4,a2
  19488.     ADD.w d7,a3
  19489.     ADD.w d7,a5
  19490.     DBRA  d4,PerfBlit3_16ReMapYLoop
  19491.   RTS
  19492. PerfBlit3_16Check4
  19493.   CMP.b   #7,d0 ; What type of blit?
  19494.   BEQ     PerfBlit3_16_Add
  19495.   BGT     PerfBlit3_16Check5
  19496. PerfBlit3_16SimpleReMap
  19497.   MOVE.w  CurrentChunkyTable1,d0
  19498.   !GetTableObjectPtr ; table base in a0
  19499.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0
  19500.   MOVEQ.l #0,d1
  19501.   MOVEQ.l #0,d2
  19502.   MOVEQ.l #16,d5
  19503. PerfBlit3_16SimpleReMapYLoop
  19504.     MOVE.w  d3,d0 ; XLoop
  19505. PerfBlit3_16SimpleReMapXLoop
  19506.       CMP.l   #-1,(a4)
  19507.       BEQ     PerfBlit3_16SimpleReMapSkip4
  19508.       TST.b   (a4) ; Mask?
  19509.       BNE     PerfBlit3_16SimpleReMapSkip1
  19510.       TST.b   (a5) ; Stencil?
  19511.       BEQ     PerfBlit3_16SimpleReMapSkip1
  19512.       MOVE.b  (a3),d1 ; Get dest
  19513.       MOVE.b  0(a0,d1.w),(a3)
  19514. PerfBlit3_16SimpleReMapSkip1
  19515.       TST.b   1(a4) ; Mask?
  19516.       BNE     PerfBlit3_16SimpleReMapSkip2
  19517.       TST.b   1(a5) ; Stencil?
  19518.       BEQ     PerfBlit3_16SimpleReMapSkip2
  19519.       MOVE.b  1(a3),d2 ; Get dest
  19520.       MOVE.b  0(a0,d2.w),1(a3)
  19521. PerfBlit3_16SimpleReMapSkip2
  19522.       TST.b   2(a4) ; Mask?
  19523.       BNE     PerfBlit3_16SimpleReMapSkip3
  19524.       TST.b   2(a5) ; Stencil?
  19525.       BEQ     PerfBlit3_16SimpleReMapSkip3
  19526.       MOVE.b  2(a3),d1 ; Get dest
  19527.       MOVE.b  0(a0,d1.w),2(a3)
  19528. PerfBlit3_16SimpleReMapSkip3
  19529.       TST.b   3(a4) ; Mask?
  19530.       BNE     PerfBlit3_16SimpleReMapSkip4
  19531.       TST.b   3(a5) ; Stencil?
  19532.       BEQ     PerfBlit3_16SimpleReMapSkip4
  19533.       MOVE.b  3(a3),d2 ; Get dest
  19534.       MOVE.b  0(a0,d2.w),3(a3)
  19535. PerfBlit3_16SimpleReMapSkip4
  19536.       CMP.l   #-1,4(a4)
  19537.       BEQ     PerfBlit3_16SimpleReMapSkip8
  19538.       TST.b   4(a4) ; Mask?
  19539.       BNE     PerfBlit3_16SimpleReMapSkip5
  19540.       TST.b   4(a5) ; Stencil?
  19541.       BEQ     PerfBlit3_16SimpleReMapSkip5
  19542.       MOVE.b  4(a3),d1 ; Get dest
  19543.       MOVE.b  0(a0,d1.w),4(a3)
  19544. PerfBlit3_16SimpleReMapSkip5
  19545.       TST.b   5(a4) ; Mask?
  19546.       BNE     PerfBlit3_16SimpleReMapSkip6
  19547.       TST.b   5(a5) ; Stencil?
  19548.       BEQ     PerfBlit3_16SimpleReMapSkip6
  19549.       MOVE.b  5(a3),d2 ; Get dest
  19550.       MOVE.b  0(a0,d2.w),5(a3)
  19551. PerfBlit3_16SimpleReMapSkip6
  19552.       TST.b   6(a4) ; Mask?
  19553.       BNE     PerfBlit3_16SimpleReMapSkip7
  19554.       TST.b   6(a5) ; Stencil?
  19555.       BEQ     PerfBlit3_16SimpleReMapSkip7
  19556.       MOVE.b  6(a3),d1 ; Get dest
  19557.       MOVE.b  0(a0,d1.w),6(a3)
  19558. PerfBlit3_16SimpleReMapSkip7
  19559.       TST.b   7(a4) ; Mask?
  19560.       BNE     PerfBlit3_16SimpleReMapSkip8
  19561.       TST.b   7(a5) ; Stencil?
  19562.       BEQ     PerfBlit3_16SimpleReMapSkip8
  19563.       MOVE.b  7(a3),d2 ; Get dest
  19564.       MOVE.b  0(a0,d2.w),7(a3)
  19565. PerfBlit3_16SimpleReMapSkip8
  19566.       CMP.l   #-1,8(a4)
  19567.       BEQ     PerfBlit3_16SimpleReMapSkip12
  19568.       TST.b   8(a4) ; Mask?
  19569.       BNE     PerfBlit3_16SimpleReMapSkip9
  19570.       TST.b   8(a5) ; Stencil?
  19571.       BEQ     PerfBlit3_16SimpleReMapSkip9
  19572.       MOVE.b  8(a3),d1 ; Get dest
  19573.       MOVE.b  0(a0,d1.w),8(a3)
  19574. PerfBlit3_16SimpleReMapSkip9
  19575.       TST.b   9(a4) ; Mask?
  19576.       BNE     PerfBlit3_16SimpleReMapSkip10
  19577.       TST.b   9(a5) ; Stencil?
  19578.       BEQ     PerfBlit3_16SimpleReMapSkip10
  19579.       MOVE.b  9(a3),d2 ; Get dest
  19580.       MOVE.b  0(a0,d2.w),9(a3)
  19581. PerfBlit3_16SimpleReMapSkip10
  19582.       TST.b   10(a4) ; Mask?
  19583.       BNE     PerfBlit3_16SimpleReMapSkip11
  19584.       TST.b   10(a5) ; Stencil?
  19585.       BEQ     PerfBlit3_16SimpleReMapSkip11
  19586.       MOVE.b  10(a3),d1 ; Get dest
  19587.       MOVE.b  0(a0,d1.w),10(a3)
  19588. PerfBlit3_16SimpleReMapSkip11
  19589.       TST.b   11(a4) ; Mask?
  19590.       BNE     PerfBlit3_16SimpleReMapSkip12
  19591.       TST.b   11(a5) ; Stencil?
  19592.       BEQ     PerfBlit3_16SimpleReMapSkip12
  19593.       MOVE.b  11(a3),d2 ; Get dest
  19594.       MOVE.b  0(a0,d2.w),11(a3)
  19595. PerfBlit3_16SimpleReMapSkip12
  19596.       CMP.l   #-1,12(a4)
  19597.       BEQ     PerfBlit3_16SimpleReMapSkip16
  19598.       TST.b   12(a4) ; Mask?
  19599.       BNE     PerfBlit3_16SimpleReMapSkip13
  19600.       TST.b   12(a5) ; Stencil?
  19601.       BEQ     PerfBlit3_16SimpleReMapSkip13
  19602.       MOVE.b  12(a3),d1 ; Get dest
  19603.       MOVE.b  0(a0,d1.w),12(a3)
  19604. PerfBlit3_16SimpleReMapSkip13
  19605.       TST.b   13(a4) ; Mask?
  19606.       BNE     PerfBlit3_16SimpleReMapSkip14
  19607.       TST.b   13(a5) ; Stencil?
  19608.       BEQ     PerfBlit3_16SimpleReMapSkip14
  19609.       MOVE.b  13(a3),d2 ; Get dest
  19610.       MOVE.b  0(a0,d2.w),13(a3)
  19611. PerfBlit3_16SimpleReMapSkip14
  19612.       TST.b   14(a4) ; Mask?
  19613.       BNE     PerfBlit3_16SimpleReMapSkip15
  19614.       TST.b   14(a5) ; Stencil?
  19615.       BEQ     PerfBlit3_16SimpleReMapSkip15
  19616.       MOVE.b  14(a3),d1 ; Get dest
  19617.       MOVE.b  0(a0,d1.w),14(a3)
  19618. PerfBlit3_16SimpleReMapSkip15
  19619.       TST.b   15(a4) ; Mask?
  19620.       BNE     PerfBlit3_16SimpleReMapSkip16
  19621.       TST.b   15(a5) ; Stencil?
  19622.       BEQ     PerfBlit3_16SimpleReMapSkip16
  19623.       MOVE.b  15(a3),d2 ; Get dest
  19624.       MOVE.b  0(a0,d2.w),15(a3)
  19625. PerfBlit3_16SimpleReMapSkip16
  19626.       ADD.w   d5,a4
  19627.       ADD.w   d5,a3
  19628.       ADD.w   d5,a5
  19629.       DBRA    d0,PerfBlit3_16SimpleReMapXLoop
  19630.     ADD.w d7,a3
  19631.     ADD.w d6,a4
  19632.     ADD.w d7,a5
  19633.     DBRA  d4,PerfBlit3_16SimpleReMapYLoop
  19634.   RTS
  19635. PerfBlit3_16_Add
  19636.   MOVE.w  d3,a0
  19637. PerfBlit3_16AddYLoop
  19638.     MOVE.w  a0,d0 ; XLoop
  19639. PerfBlit3_16AddXLoop
  19640.       MOVE.l  (a2)+,d1 ; Get source data
  19641.       MOVE.l  (a2)+,d2 ; Get source data
  19642.       MOVE.l  (a2)+,d3 ; Get source data
  19643.       MOVE.l  (a2)+,d5 ; Get source data
  19644.       TST.b   (a5)+ ; Change byte?
  19645.       BEQ     PerfBlit3_16AddSkip1
  19646.       ADD.b   d1,3(a3) ; Add to dest
  19647. PerfBlit3_16AddSkip1
  19648.       LSR.w   #8,d1
  19649.       TST.b   (a5)+ ; Change byte?
  19650.       BEQ     PerfBlit3_16AddSkip2
  19651.       ADD.b   d1,2(a3) ; Add to dest
  19652. PerfBlit3_16AddSkip2
  19653.       SWAP    d1
  19654.       TST.b   (a5)+ ; Change byte?
  19655.       BEQ     PerfBlit3_16AddSkip3
  19656.       ADD.b   d1,1(a3) ; Add to dest
  19657. PerfBlit3_16AddSkip3
  19658.       LSR.w   #8,d1
  19659.       TST.b   (a5)+ ; Change byte?
  19660.       BEQ     PerfBlit3_16AddSkip4
  19661.       ADD.b   d1,(a3) ; Add to dest
  19662. PerfBlit3_16AddSkip4
  19663.       TST.b   (a5)+ ; Change byte?
  19664.       BEQ     PerfBlit3_16AddSkip5
  19665.       ADD.b   d2,7(a3) ; Add to dest
  19666. PerfBlit3_16AddSkip5
  19667.       LSR.w   #8,d2
  19668.       TST.b   (a5)+ ; Change byte?
  19669.       BEQ     PerfBlit3_16AddSkip6
  19670.       ADD.b   d2,6(a3) ; Add to dest
  19671. PerfBlit3_16AddSkip6
  19672.       SWAP    d2
  19673.       TST.b   (a5)+ ; Change byte?
  19674.       BEQ     PerfBlit3_16AddSkip7
  19675.       ADD.b   d2,5(a3) ; Add to dest
  19676. PerfBlit3_16AddSkip7
  19677.       LSR.w   #8,d2
  19678.       TST.b   (a5)+ ; Change byte?
  19679.       BEQ     PerfBlit3_16AddSkip8
  19680.       ADD.b   d2,4(a3) ; Add to dest
  19681. PerfBlit3_16AddSkip8
  19682.       TST.b   (a5)+ ; Change byte?
  19683.       BEQ     PerfBlit3_16AddSkip9
  19684.       ADD.b   d3,11(a3) ; Add to dest
  19685. PerfBlit3_16AddSkip9
  19686.       LSR.w   #8,d3
  19687.       TST.b   (a5)+ ; Change byte?
  19688.       BEQ     PerfBlit3_16AddSkip10
  19689.       ADD.b   d3,10(a3) ; Add to dest
  19690. PerfBlit3_16AddSkip10
  19691.       SWAP    d3
  19692.       TST.b   (a5)+ ; Change byte?
  19693.       BEQ     PerfBlit3_16AddSkip11
  19694.       ADD.b   d3,9(a3) ; Add to dest
  19695. PerfBlit3_16AddSkip11
  19696.       LSR.w   #8,d3
  19697.       TST.b   (a5)+ ; Change byte?
  19698.       BEQ     PerfBlit3_16AddSkip12
  19699.       ADD.b   d3,8(a3) ; Add to dest
  19700. PerfBlit3_16AddSkip12
  19701.       TST.b   (a5)+ ; Change byte?
  19702.       BEQ     PerfBlit3_16AddSkip13
  19703.       ADD.b   d5,15(a3) ; Add to dest
  19704. PerfBlit3_16AddSkip13
  19705.       LSR.w   #8,d5
  19706.       TST.b   (a5)+ ; Change byte?
  19707.       BEQ     PerfBlit3_16AddSkip14
  19708.       ADD.b   d5,14(a3) ; Add to dest
  19709. PerfBlit3_16AddSkip14
  19710.       SWAP    d5
  19711.       TST.b   (a5)+ ; Change byte?
  19712.       BEQ     PerfBlit3_16AddSkip15
  19713.       ADD.b   d5,13(a3) ; Add to dest
  19714. PerfBlit3_16AddSkip15
  19715.       LSR.w   #8,d5
  19716.       TST.b   (a5)+ ; Change byte?
  19717.       BEQ     PerfBlit3_16AddSkip16
  19718.       ADD.b   d5,12(a3) ; Add to dest
  19719. PerfBlit3_16AddSkip16
  19720.       ADD.l   #16,a3 ; Skip 16
  19721.       DBRA    d0,PerfBlit3_16AddXLoop
  19722.     ADD.w d6,a2
  19723.     ADD.w d7,a3
  19724.     ADD.w d7,a5
  19725.     DBRA  d4,PerfBlit3_16AddYLoop
  19726.   RTS
  19727. PerfBlit3_16Check5
  19728.   ; Next check
  19729.   RTS
  19730.  
  19731. PerformBlit3b_16
  19732. ;Do a `Blit' stencilled-blit, width should be multiple of 4, backwards
  19733. ;Copies data backwards using stencil for cookie-cut and cuts image behind dest stencil
  19734. ;d0=BlitModeType
  19735. ;d3=Operation width
  19736. ;d4=Operation height
  19737. ;d6=Source linemodulo
  19738. ;d7=Dest linemodulo
  19739. ;a2=Source data address
  19740. ;a3=Dest data address
  19741. ;a4=Source stencil address
  19742. ;a5=Dest stencil address
  19743. ;Trashes many
  19744.   MOVE.w  d3,d5 ; Get Width
  19745.   ADD.w   d6,d5 ; Add source linemod
  19746.   MULU    d4,d5 ; Total bytes
  19747.   SUB.l   d6,d5 ; -Linemod of last line
  19748.   ADD.l   d5,a2 ; Add to source address
  19749.   ADD.l   d5,a4 ; Add to source stencil address
  19750.   MOVE.w  d3,d5 ; Get Width
  19751.   ADD.w   d7,d5 ; Add dest linemod
  19752.   MULU    d4,d5 ; Total bytes
  19753.   SUB.l   d7,d5 ; -Linemod of last line
  19754.   ADD.l   d5,a3 ; Add to dest address
  19755.   ADD.l   d5,a5 ; Add to dest stencil address
  19756.   LSR.w   #4,d3 ; Width/16 for groups of 4 longwords
  19757.   SUBQ.w  #1,d3 ; XLoopcounter
  19758.   SUBQ.w  #1,d4 ; YLoopcounter
  19759.   CMP.b   #1,d0 ; What type of blit?
  19760.   BEQ     PerfBlit3b_16EraseYLoop
  19761.   BGT     PerfBlit3b_16Check2
  19762.   MOVE.w  d3,a0
  19763.   MOVE.l  a6,-(a7) ; Store
  19764.   MOVE.w  d6,a1
  19765.   MOVE.w  d7,a6
  19766. PerfBlit3b_16CookieYLoop
  19767.     MOVE.w  a0,d0 ; XLoop
  19768. PerfBlit3b_16CookieXLoop
  19769.       MOVE.l  -(a5),d2 ; Get dest stencil
  19770.       MOVE.l  -(a5),d7 ; Get dest stencil
  19771.       NOT.l   d2 ; Inverse dest stencil
  19772.       MOVE.l  -(a4),d1 ; Get source stencil
  19773.       NOT.l   d7 ; Inverse dest stencil
  19774.       MOVE.l  -(a4),d6 ; Get source stencil
  19775.       OR.l    d2,d1 ; Combine stencils
  19776.       MOVE.l  -(a3),d3 ; Get dest data
  19777.       OR.l    d7,d6 ; Combine stencils
  19778.       MOVE.l  -(a3),d5 ; Get dest data
  19779.       AND.l   d1,d3 ; And with dest
  19780.       AND.l   d6,d5 ; And with dest
  19781.       NOT.l   d2 ; Inverse mask
  19782.       MOVE.l  -(a2),d1 ; Get source data
  19783.       NOT.l   d7 ; Inverse mask
  19784.       MOVE.l  -(a2),d6 ; Get source data
  19785.       AND.l   d2,d1 ; And with source
  19786.       AND.l   d7,d6 ; And with source
  19787.       OR.l    d1,d3 ; Combine
  19788.       MOVE.l  d3,4(a3) ; Write
  19789.       OR.l    d6,d5 ; Combine
  19790.       MOVE.l  d5,(a3) ; Write
  19791.       MOVE.l  -(a5),d2 ; Get dest stencil
  19792.       MOVE.l  -(a5),d7 ; Get dest stencil
  19793.       NOT.l   d2 ; Inverse dest stencil
  19794.       MOVE.l  -(a4),d1 ; Get source stencil
  19795.       NOT.l   d7 ; Inverse dest stencil
  19796.       MOVE.l  -(a4),d6 ; Get source stencil
  19797.       OR.l    d2,d1 ; Combine stencils
  19798.       MOVE.l  -(a3),d3 ; Get dest data
  19799.       OR.l    d7,d6 ; Combine stencils
  19800.       MOVE.l  -(a3),d5 ; Get dest data
  19801.       AND.l   d1,d3 ; And with dest
  19802.       AND.l   d6,d5 ; And with dest
  19803.       NOT.l   d2 ; Inverse mask
  19804.       MOVE.l  -(a2),d1 ; Get source data
  19805.       NOT.l   d7 ; Inverse mask
  19806.       MOVE.l  -(a2),d6 ; Get source data
  19807.       AND.l   d2,d1 ; And with source
  19808.       AND.l   d7,d6 ; And with source
  19809.       OR.l    d1,d3 ; Combine
  19810.       MOVE.l  d3,4(a3) ; Write
  19811.       OR.l    d6,d5 ; Combine
  19812.       MOVE.l  d5,(a3) ; Write
  19813.       DBRA    d0,PerfBlit3b_16CookieXLoop
  19814.     SUB.w a1,a2
  19815.     SUB.w a1,a4
  19816.     SUB.w a6,a3
  19817.     SUB.w a6,a5
  19818.     DBRA  d4,PerfBlit3b_16CookieYLoop
  19819.   MOVE.l  (a7)+,a6 ; Restore
  19820.   RTS
  19821. PerfBlit3b_16EraseYLoop
  19822.     MOVE.w  d3,d0 ; XLoop
  19823. PerfBlit3b_16EraseXLoop
  19824.       MOVE.l  -(a5),d1 ; Get dest stencil
  19825.       MOVE.l  -(a5),d2
  19826.       NOT.l   d1 ; Inverse dest stencil
  19827.       MOVE.l  -(a5),d3
  19828.       NOT.l   d2
  19829.       MOVE.l  -(a5),d5
  19830.       NOT.l   d3
  19831.       OR.l    -(a4),d1 ; Combine stencils
  19832.       NOT.l   d5
  19833.       OR.l    -(a4),d2
  19834.       OR.l    -(a4),d3
  19835.       OR.l    -(a4),d5
  19836.       AND.l   d1,-(a3) ; And with dest
  19837.       AND.l   d2,-(a3)
  19838.       AND.l   d3,-(a3)
  19839.       AND.l   d5,-(a3)
  19840.       DBRA    d0,PerfBlit3b_16EraseXLoop
  19841.     SUB.w d6,a4
  19842.     SUB.w d7,a3
  19843.     SUB.w d7,a5
  19844.     DBRA  d4,PerfBlit3b_16EraseYLoop
  19845.   RTS
  19846. PerfBlit3b_16Check2 ; Do more type tests
  19847.   CMP.b   #3,d0 ; What type of blit?
  19848.   BEQ     PerfBlit3b_16SolidYLoop
  19849.   BGT     PerfBlit3b_16Check3
  19850.   MOVE.w  d3,a0
  19851. PerfBlit3b_16InvYLoop
  19852.     MOVE.w  a0,d0 ; XLoop
  19853. PerfBlit3b_16InvXLoop
  19854.       MOVE.l  -(a4),d1 ; Get source stencil
  19855.       MOVE.l  -(a4),d2
  19856.       NOT.l   d1 ; Inverse mask
  19857.       MOVE.l  -(a4),d3
  19858.       NOT.l   d2
  19859.       MOVE.l  -(a4),d5
  19860.       NOT.l   d3
  19861.       AND.l   -(a5),d1 ; Combine stencils
  19862.       NOT.l   d5
  19863.       AND.l   -(a5),d2
  19864.       AND.l   -(a5),d3
  19865.       AND.l   -(a5),d5
  19866.       EOR.l   d1,-(a3) ; Eor with dest
  19867.       EOR.l   d2,-(a3)
  19868.       EOR.l   d3,-(a3)
  19869.       EOR.l   d5,-(a3)
  19870.       DBRA    d0,PerfBlit3b_16InvXLoop
  19871.     SUB.w d6,a4
  19872.     SUB.w d7,a3
  19873.     SUB.w d7,a5
  19874.     DBRA  d4,PerfBlit3b_16InvYLoop
  19875.   RTS
  19876. PerfBlit3b_16SolidYLoop
  19877.     MOVE.w  d3,d0 ; XLoop
  19878. PerfBlit3b_16SolidXLoop
  19879.       MOVE.l  -(a4),d1 ; Get source stencil
  19880.       MOVE.l  -(a4),d2
  19881.       NOT.l   d1 ; Inverse mask
  19882.       MOVE.l  -(a4),d3
  19883.       NOT.l   d2
  19884.       MOVE.l  -(a4),d5
  19885.       NOT.l   d3
  19886.       AND.l   -(a5),d1 ; Combine stencils
  19887.       NOT.l   d5
  19888.       AND.l   -(a5),d2
  19889.       NOT.l   d1 ; Inverse mask
  19890.       AND.l   -(a5),d3
  19891.       NOT.l   d2
  19892.       AND.l   -(a5),d5
  19893.       NOT.l   d3
  19894.       AND.l   d1,-(a3) ; Or with dest
  19895.       NOT.l   d5
  19896.       AND.l   d2,-(a3)
  19897.       AND.l   d3,-(a3)
  19898.       AND.l   d5,-(a3)
  19899.       DBRA    d0,PerfBlit3b_16SolidXLoop
  19900.     SUB.w d6,a4
  19901.     SUB.w d7,a3
  19902.     SUB.w d7,a5
  19903.     DBRA  d4,PerfBlit3b_16SolidYLoop
  19904.   RTS
  19905. PerfBlit3b_16Check3
  19906.   CMP.b   #5,d0 ; What type of blit?
  19907.   BEQ     PerfBlit3b_16Re_Map
  19908.   BGT     PerfBlit3b_16Check4
  19909.   MOVE.b  CurrentInk1,d5
  19910.   MOVE.b  d5,d1
  19911.   LSL.w   #8,d5
  19912.   MOVE.b  d1,d5
  19913.   MOVE.w  d5,d1
  19914.   SWAP    d5
  19915.   MOVE.w  d1,d5
  19916.   MOVE.l  a6,-(a7) ; Store
  19917.   MOVE.w  d3,a6
  19918.   MOVE.w  d6,a2
  19919.   MOVE.w  d7,a1
  19920. PerfBlit3b_16ColourYLoop
  19921.     MOVE.w  a6,d0 ; XLoop
  19922. PerfBlit3b_16ColourXLoop
  19923.       MOVE.l  -(a5),d2 ; Get dest stencil
  19924.       MOVE.l  -(a4),d1 ; Get source stencil
  19925.       NOT.l   d2 ; Inverse dest stencil
  19926.       MOVE.l  d1,d7 ; Copy
  19927.       MOVE.l  -(a3),d6 ; Get dest data
  19928.       OR.l    d2,d1 ; Combine stencils
  19929.       AND.l   d1,d6 ; And with dest
  19930.       MOVE.l  d5,d1 ; Get source data
  19931.       NOT.l   d2 ; Inverse mask
  19932.       NOT.l   d7 ; Inverse
  19933.       AND.l   d2,d1 ; And with source
  19934.       AND.l   d7,d1 ; And sourcemask
  19935.       OR.l    d1,d6 ; Combine
  19936.       MOVE.l  d6,(a3) ; Write
  19937.       MOVE.l  -(a5),d2 ; Get dest stencil
  19938.       MOVE.l  -(a4),d1 ; Get source stencil
  19939.       NOT.l   d2 ; Inverse dest stencil
  19940.       MOVE.l  d1,d7 ; Copy
  19941.       MOVE.l  -(a3),d6 ; Get dest data
  19942.       OR.l    d2,d1 ; Combine stencils
  19943.       AND.l   d1,d6 ; And with dest
  19944.       MOVE.l  d5,d1 ; Get source data
  19945.       NOT.l   d2 ; Inverse mask
  19946.       NOT.l   d7 ; Inverse
  19947.       AND.l   d2,d1 ; And with source
  19948.       AND.l   d7,d1 ; And sourcemask
  19949.       OR.l    d1,d6 ; Combine
  19950.       MOVE.l  d6,(a3) ; Write
  19951.       MOVE.l  -(a5),d2 ; Get dest stencil
  19952.       MOVE.l  -(a4),d1 ; Get source stencil
  19953.       NOT.l   d2 ; Inverse dest stencil
  19954.       MOVE.l  d1,d7 ; Copy
  19955.       MOVE.l  -(a3),d6 ; Get dest data
  19956.       OR.l    d2,d1 ; Combine stencils
  19957.       AND.l   d1,d6 ; And with dest
  19958.       MOVE.l  d5,d1 ; Get source data
  19959.       NOT.l   d2 ; Inverse mask
  19960.       NOT.l   d7 ; Inverse
  19961.       AND.l   d2,d1 ; And with source
  19962.       AND.l   d7,d1 ; And sourcemask
  19963.       OR.l    d1,d6 ; Combine
  19964.       MOVE.l  d6,(a3) ; Write
  19965.       MOVE.l  -(a5),d2 ; Get dest stencil
  19966.       MOVE.l  -(a4),d1 ; Get source stencil
  19967.       NOT.l   d2 ; Inverse dest stencil
  19968.       MOVE.l  d1,d7 ; Copy
  19969.       MOVE.l  -(a3),d6 ; Get dest data
  19970.       OR.l    d2,d1 ; Combine stencils
  19971.       AND.l   d1,d6 ; And with dest
  19972.       MOVE.l  d5,d1 ; Get source data
  19973.       NOT.l   d2 ; Inverse mask
  19974.       NOT.l   d7 ; Inverse
  19975.       AND.l   d2,d1 ; And with source
  19976.       AND.l   d7,d1 ; And sourcemask
  19977.       OR.l    d1,d6 ; Combine
  19978.       MOVE.l  d6,(a3) ; Write
  19979.       DBRA    d0,PerfBlit3b_16ColourXLoop
  19980.     SUB.w   a2,a4
  19981.     SUB.w   a1,a3
  19982.     SUB.w   a1,a5
  19983.     DBRA    d4,PerfBlit3b_16ColourYLoop
  19984.   MOVE.l  (a7)+,a6 ; Restore
  19985.   RTS
  19986. PerfBlit3b_16Re_Map
  19987.   MOVE.w  CurrentChunkyTable1,d0
  19988.   !GetTableObjectPtr ; table base in a0
  19989.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0
  19990.   MOVE.w  d3,a1
  19991.   MOVEQ.l #0,d1
  19992.   MOVEQ.l #0,d2
  19993.   MOVEQ.l #0,d3
  19994.   MOVEQ.l #0,d5
  19995.   MOVE.w  d6,a4
  19996. PerfBlit3b_16ReMapYLoop
  19997.     MOVE.w  a1,d0 ; XLoop
  19998. PerfBlit3b_16ReMapXLoop
  19999.       MOVE.b  -(a2),d1 ; Get data
  20000.       MOVEQ.l #0,d3
  20001.       MOVE.b  -(a2),d2 ; Get data
  20002.       LSL.w   #8,d1
  20003.       MOVE.b  -(a2),d3 ; Get data
  20004.       LSL.w   #8,d2
  20005.       MOVE.b  -(a2),d5 ; Get data
  20006.       LSL.w   #8,d3
  20007.       MOVE.l  -(a3),d6
  20008.       MOVE.b  3(a3),d1
  20009.       LSL.w   #8,d5
  20010.       MOVE.b  2(a3),d2
  20011.       MOVE.b  1(a3),d3
  20012.       MOVE.b  (a3),d5
  20013.       MOVE.b  0(a0,d2.l),d2
  20014.       SWAP    d2
  20015.       MOVE.b  0(a0,d5.l),d2
  20016.       LSL.l   #8,d2
  20017.       MOVE.l  -(a5),d1
  20018.       MOVE.b  0(a0,d3.l),d2
  20019.       SWAP    d2
  20020.       MOVE.b  0(a0,d1.l),d2
  20021.       AND.l   d1,d2
  20022.       NOT.l   d1
  20023.       AND.l   d1,d6
  20024.       OR.l    d6,d2
  20025.       MOVE.l  d2,(a3)
  20026.       MOVEQ.l #0,d1
  20027.       MOVE.b  -(a2),d1 ; Get data
  20028.       MOVEQ.l #0,d3
  20029.       MOVE.b  -(a2),d2 ; Get data
  20030.       LSL.w   #8,d1
  20031.       MOVE.b  -(a2),d3 ; Get data
  20032.       LSL.w   #8,d2
  20033.       MOVE.b  -(a2),d5 ; Get data
  20034.       LSL.w   #8,d3
  20035.       MOVE.l  -(a3),d6
  20036.       MOVE.b  3(a3),d1
  20037.       LSL.w   #8,d5
  20038.       MOVE.b  2(a3),d2
  20039.       MOVE.b  1(a3),d3
  20040.       MOVE.b  (a3),d5
  20041.       MOVE.b  0(a0,d2.l),d2
  20042.       SWAP    d2
  20043.       MOVE.b  0(a0,d5.l),d2
  20044.       LSL.l   #8,d2
  20045.       MOVE.l  -(a5),d1
  20046.       MOVE.b  0(a0,d3.l),d2
  20047.       SWAP    d2
  20048.       MOVE.b  0(a0,d1.l),d2
  20049.       AND.l   d1,d2
  20050.       NOT.l   d1
  20051.       AND.l   d1,d6
  20052.       OR.l    d6,d2
  20053.       MOVE.l  d2,(a3)
  20054.       MOVEQ.l #0,d1
  20055.       MOVE.b  -(a2),d1 ; Get data
  20056.       MOVEQ.l #0,d3
  20057.       MOVE.b  -(a2),d2 ; Get data
  20058.       LSL.w   #8,d1
  20059.       MOVE.b  -(a2),d3 ; Get data
  20060.       LSL.w   #8,d2
  20061.       MOVE.b  -(a2),d5 ; Get data
  20062.       LSL.w   #8,d3
  20063.       MOVE.l  -(a3),d6
  20064.       MOVE.b  3(a3),d1
  20065.       LSL.w   #8,d5
  20066.       MOVE.b  2(a3),d2
  20067.       MOVE.b  1(a3),d3
  20068.       MOVE.b  (a3),d5
  20069.       MOVE.b  0(a0,d2.l),d2
  20070.       SWAP    d2
  20071.       MOVE.b  0(a0,d5.l),d2
  20072.       LSL.l   #8,d2
  20073.       MOVE.l  -(a5),d1
  20074.       MOVE.b  0(a0,d3.l),d2
  20075.       SWAP    d2
  20076.       MOVE.b  0(a0,d1.l),d2
  20077.       AND.l   d1,d2
  20078.       NOT.l   d1
  20079.       AND.l   d1,d6
  20080.       OR.l    d6,d2
  20081.       MOVE.l  d2,(a3)
  20082.       MOVEQ.l #0,d1
  20083.       MOVE.b  -(a2),d1 ; Get data
  20084.       MOVEQ.l #0,d3
  20085.       MOVE.b  -(a2),d2 ; Get data
  20086.       LSL.w   #8,d1
  20087.       MOVE.b  -(a2),d3 ; Get data
  20088.       LSL.w   #8,d2
  20089.       MOVE.b  -(a2),d5 ; Get data
  20090.       LSL.w   #8,d3
  20091.       MOVE.l  -(a3),d6
  20092.       MOVE.b  3(a3),d1
  20093.       LSL.w   #8,d5
  20094.       MOVE.b  2(a3),d2
  20095.       MOVE.b  1(a3),d3
  20096.       MOVE.b  (a3),d5
  20097.       MOVE.b  0(a0,d2.l),d2
  20098.       SWAP    d2
  20099.       MOVE.b  0(a0,d5.l),d2
  20100.       LSL.l   #8,d2
  20101.       MOVE.l  -(a5),d1
  20102.       MOVE.b  0(a0,d3.l),d2
  20103.       SWAP    d2
  20104.       MOVE.b  0(a0,d1.l),d2
  20105.       AND.l   d1,d2
  20106.       NOT.l   d1
  20107.       AND.l   d1,d6
  20108.       OR.l    d6,d2
  20109.       MOVE.l  d2,(a3)
  20110.       MOVEQ.l #0,d1
  20111.       DBRA    d0,PerfBlit3b_16ReMapXLoop
  20112.     SUB.w a4,a2
  20113.     SUB.w d7,a3
  20114.     SUB.w d7,a5
  20115.     DBRA  d4,PerfBlit3b_16ReMapYLoop
  20116.   RTS
  20117. PerfBlit3b_16Check4
  20118.   CMP.b   #7,d0 ; What type of blit?
  20119.   BEQ     PerfBlit3b_16_Add
  20120.   BGT     PerfBlit3b_16Check5
  20121. PerfBlit3b_16SimpleReMap
  20122.   MOVE.w  CurrentChunkyTable1,d0
  20123.   !GetTableObjectPtr ; table base in a0
  20124.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0
  20125.   MOVEQ.l #0,d1
  20126.   MOVEQ.l #0,d2
  20127.   MOVEQ.l #16,d5
  20128. PerfBlit3b_16SimpleReMapYLoop
  20129.     MOVE.w  d3,d0 ; XLoop
  20130. PerfBlit3b_16SimpleReMapXLoop
  20131.       SUB.w   d5,a4
  20132.       SUB.w   d5,a3
  20133.       SUB.w   d5,a5
  20134.       CMP.l   #-1,12(a4)
  20135.       BEQ     PerfBlit3b_16SimpleReMapSkip4
  20136.       TST.b   15(a4) ; Mask?
  20137.       BNE     PerfBlit3b_16SimpleReMapSkip1
  20138.       TST.b   15(a5) ; Stencil?
  20139.       BEQ     PerfBlit3b_16SimpleReMapSkip1
  20140.       MOVE.b  15(a3),d1 ; Get dest
  20141.       MOVE.b  0(a0,d1.w),15(a3)
  20142. PerfBlit3b_16SimpleReMapSkip1
  20143.       TST.b   14(a4) ; Mask?
  20144.       BNE     PerfBlit3b_16SimpleReMapSkip2
  20145.       TST.b   14(a5) ; Stencil?
  20146.       BEQ     PerfBlit3b_16SimpleReMapSkip2
  20147.       MOVE.b  14(a3),d2 ; Get dest
  20148.       MOVE.b  0(a0,d2.w),14(a3)
  20149. PerfBlit3b_16SimpleReMapSkip2
  20150.       TST.b   13(a4) ; Mask?
  20151.       BNE     PerfBlit3b_16SimpleReMapSkip3
  20152.       TST.b   13(a5) ; Stencil?
  20153.       BEQ     PerfBlit3b_16SimpleReMapSkip3
  20154.       MOVE.b  13(a3),d1 ; Get dest
  20155.       MOVE.b  0(a0,d1.w),13(a3)
  20156. PerfBlit3b_16SimpleReMapSkip3
  20157.       TST.b   12(a4) ; Mask?
  20158.       BNE     PerfBlit3b_16SimpleReMapSkip4
  20159.       TST.b   12(a5) ; Stencil?
  20160.       BEQ     PerfBlit3b_16SimpleReMapSkip4
  20161.       MOVE.b  12(a3),d2 ; Get dest
  20162.       MOVE.b  0(a0,d2.w),12(a3)
  20163. PerfBlit3b_16SimpleReMapSkip4
  20164.       CMP.l   #-1,8(a4)
  20165.       BEQ     PerfBlit3b_16SimpleReMapSkip8
  20166.       TST.b   11(a4) ; Mask?
  20167.       BNE     PerfBlit3b_16SimpleReMapSkip5
  20168.       TST.b   11(a5) ; Stencil?
  20169.       BEQ     PerfBlit3b_16SimpleReMapSkip5
  20170.       MOVE.b  11(a3),d1 ; Get dest
  20171.       MOVE.b  0(a0,d1.w),11(a3)
  20172. PerfBlit3b_16SimpleReMapSkip5
  20173.       TST.b   10(a4) ; Mask?
  20174.       BNE     PerfBlit3b_16SimpleReMapSkip6
  20175.       TST.b   10(a5) ; Stencil?
  20176.       BEQ     PerfBlit3b_16SimpleReMapSkip6
  20177.       MOVE.b  10(a3),d2 ; Get dest
  20178.       MOVE.b  0(a0,d2.w),10(a3)
  20179. PerfBlit3b_16SimpleReMapSkip6
  20180.       TST.b   9(a4) ; Mask?
  20181.       BNE     PerfBlit3b_16SimpleReMapSkip7
  20182.       TST.b   9(a5) ; Stencil?
  20183.       BEQ     PerfBlit3b_16SimpleReMapSkip7
  20184.       MOVE.b  9(a3),d1 ; Get dest
  20185.       MOVE.b  0(a0,d1.w),9(a3)
  20186. PerfBlit3b_16SimpleReMapSkip7
  20187.       TST.b   8(a4) ; Mask?
  20188.       BNE     PerfBlit3b_16SimpleReMapSkip8
  20189.       TST.b   8(a5) ; Stencil?
  20190.       BEQ     PerfBlit3b_16SimpleReMapSkip8
  20191.       MOVE.b  8(a3),d2 ; Get dest
  20192.       MOVE.b  0(a0,d2.w),8(a3)
  20193. PerfBlit3b_16SimpleReMapSkip8
  20194.       CMP.l   #-1,4(a4)
  20195.       BEQ     PerfBlit3b_16SimpleReMapSkip12
  20196.       TST.b   7(a4) ; Mask?
  20197.       BNE     PerfBlit3b_16SimpleReMapSkip9
  20198.       TST.b   7(a5) ; Stencil?
  20199.       BEQ     PerfBlit3b_16SimpleReMapSkip9
  20200.       MOVE.b  7(a3),d1 ; Get dest
  20201.       MOVE.b  0(a0,d1.w),7(a3)
  20202. PerfBlit3b_16SimpleReMapSkip9
  20203.       TST.b   6(a4) ; Mask?
  20204.       BNE     PerfBlit3b_16SimpleReMapSkip10
  20205.       TST.b   6(a5) ; Stencil?
  20206.       BEQ     PerfBlit3b_16SimpleReMapSkip10
  20207.       MOVE.b  6(a3),d2 ; Get dest
  20208.       MOVE.b  0(a0,d2.w),6(a3)
  20209. PerfBlit3b_16SimpleReMapSkip10
  20210.       TST.b   5(a4) ; Mask?
  20211.       BNE     PerfBlit3b_16SimpleReMapSkip11
  20212.       TST.b   5(a5) ; Stencil?
  20213.       BEQ     PerfBlit3b_16SimpleReMapSkip11
  20214.       MOVE.b  5(a3),d1 ; Get dest
  20215.       MOVE.b  0(a0,d1.w),5(a3)
  20216. PerfBlit3b_16SimpleReMapSkip11
  20217.       TST.b   4(a4) ; Mask?
  20218.       BNE     PerfBlit3b_16SimpleReMapSkip12
  20219.       TST.b   4(a5) ; Stencil?
  20220.       BEQ     PerfBlit3b_16SimpleReMapSkip12
  20221.       MOVE.b  4(a3),d2 ; Get dest
  20222.       MOVE.b  0(a0,d2.w),4(a3)
  20223. PerfBlit3b_16SimpleReMapSkip12
  20224.       CMP.l   #-1,(a4)
  20225.       BEQ     PerfBlit3b_16SimpleReMapSkip16
  20226.       TST.b   3(a4) ; Mask?
  20227.       BNE     PerfBlit3b_16SimpleReMapSkip13
  20228.       TST.b   3(a5) ; Stencil?
  20229.       BEQ     PerfBlit3b_16SimpleReMapSkip13
  20230.       MOVE.b  3(a3),d1 ; Get dest
  20231.       MOVE.b  0(a0,d1.w),3(a3)
  20232. PerfBlit3b_16SimpleReMapSkip13
  20233.       TST.b   2(a4) ; Mask?
  20234.       BNE     PerfBlit3b_16SimpleReMapSkip14
  20235.       TST.b   2(a5) ; Stencil?
  20236.       BEQ     PerfBlit3b_16SimpleReMapSkip14
  20237.       MOVE.b  2(a3),d2 ; Get dest
  20238.       MOVE.b  0(a0,d2.w),2(a3)
  20239. PerfBlit3b_16SimpleReMapSkip14
  20240.       TST.b   1(a4) ; Mask?
  20241.       BNE     PerfBlit3b_16SimpleReMapSkip15
  20242.       TST.b   1(a5) ; Stencil?
  20243.       BEQ     PerfBlit3b_16SimpleReMapSkip15
  20244.       MOVE.b  1(a3),d1 ; Get dest
  20245.       MOVE.b  0(a0,d1.w),1(a3)
  20246. PerfBlit3b_16SimpleReMapSkip15
  20247.       TST.b   (a4) ; Mask?
  20248.       BNE     PerfBlit3b_16SimpleReMapSkip16
  20249.       TST.b   (a5) ; Stencil?
  20250.       BEQ     PerfBlit3b_16SimpleReMapSkip16
  20251.       MOVE.b  (a3),d2 ; Get dest
  20252.       MOVE.b  0(a0,d2.w),(a3)
  20253. PerfBlit3b_16SimpleReMapSkip16
  20254.       DBRA    d0,PerfBlit3b_16SimpleReMapXLoop
  20255.     SUB.w d7,a3
  20256.     SUB.w d6,a4
  20257.     SUB.w d7,a5
  20258.     DBRA  d4,PerfBlit3b_16SimpleReMapYLoop
  20259.   RTS
  20260. PerfBlit3b_16_Add
  20261.   MOVE.w  d3,a0
  20262. PerfBlit3b_16AddYLoop
  20263.     MOVE.w  a0,d0 ; XLoop
  20264. PerfBlit3b_16AddXLoop
  20265.       MOVE.l  -(a2),d1 ; Get source data
  20266.       MOVE.l  -(a2),d2 ; Get source data
  20267.       SUB.l   #16,a3 ; Skip 16
  20268.       MOVE.l  -(a2),d3 ; Get source data
  20269.       MOVE.l  -(a2),d5 ; Get source data
  20270.       TST.b   -(a5) ; Change byte?
  20271.       BEQ     PerfBlit3b_16AddSkip1
  20272.       ADD.b   d1,15(a3) ; Add to dest
  20273. PerfBlit3b_16AddSkip1
  20274.       LSR.w   #8,d1
  20275.       TST.b   -(a5) ; Change byte?
  20276.       BEQ     PerfBlit3b_16AddSkip2
  20277.       ADD.b   d1,14(a3) ; Add to dest
  20278. PerfBlit3b_16AddSkip2
  20279.       SWAP    d1
  20280.       TST.b   -(a5) ; Change byte?
  20281.       BEQ     PerfBlit3b_16AddSkip3
  20282.       ADD.b   d1,13(a3) ; Add to dest
  20283. PerfBlit3b_16AddSkip3
  20284.       LSR.w   #8,d1
  20285.       TST.b   -(a5) ; Change byte?
  20286.       BEQ     PerfBlit3b_16AddSkip4
  20287.       ADD.b   d1,12(a3) ; Add to dest
  20288. PerfBlit3b_16AddSkip4
  20289.       TST.b   -(a5) ; Change byte?
  20290.       BEQ     PerfBlit3b_16AddSkip5
  20291.       ADD.b   d2,11(a3) ; Add to dest
  20292. PerfBlit3b_16AddSkip5
  20293.       LSR.w   #8,d2
  20294.       TST.b   -(a5) ; Change byte?
  20295.       BEQ     PerfBlit3b_16AddSkip6
  20296.       ADD.b   d2,10(a3) ; Add to dest
  20297. PerfBlit3b_16AddSkip6
  20298.       SWAP    d2
  20299.       TST.b   -(a5) ; Change byte?
  20300.       BEQ     PerfBlit3b_16AddSkip7
  20301.       ADD.b   d2,9(a3) ; Add to dest
  20302. PerfBlit3b_16AddSkip7
  20303.       LSR.w   #8,d2
  20304.       TST.b   -(a5) ; Change byte?
  20305.       BEQ     PerfBlit3b_16AddSkip8
  20306.       ADD.b   d2,8(a3) ; Add to dest
  20307. PerfBlit3b_16AddSkip8
  20308.       TST.b   -(a5) ; Change byte?
  20309.       BEQ     PerfBlit3b_16AddSkip9
  20310.       ADD.b   d3,7(a3) ; Add to dest
  20311. PerfBlit3b_16AddSkip9
  20312.       LSR.w   #8,d3
  20313.       TST.b   -(a5) ; Change byte?
  20314.       BEQ     PerfBlit3b_16AddSkip10
  20315.       ADD.b   d3,6(a3) ; Add to dest
  20316. PerfBlit3b_16AddSkip10
  20317.       SWAP    d3
  20318.       TST.b   -(a5) ; Change byte?
  20319.       BEQ     PerfBlit3b_16AddSkip11
  20320.       ADD.b   d3,5(a3) ; Add to dest
  20321. PerfBlit3b_16AddSkip11
  20322.       LSR.w   #8,d3
  20323.       TST.b   -(a5) ; Change byte?
  20324.       BEQ     PerfBlit3b_16AddSkip12
  20325.       ADD.b   d3,4(a3) ; Add to dest
  20326. PerfBlit3b_16AddSkip12
  20327.       TST.b   -(a5) ; Change byte?
  20328.       BEQ     PerfBlit3b_16AddSkip13
  20329.       ADD.b   d5,3(a3) ; Add to dest
  20330. PerfBlit3b_16AddSkip13
  20331.       LSR.w   #8,d5
  20332.       TST.b   -(a5) ; Change byte?
  20333.       BEQ     PerfBlit3b_16AddSkip14
  20334.       ADD.b   d5,2(a3) ; Add to dest
  20335. PerfBlit3b_16AddSkip14
  20336.       SWAP    d5
  20337.       TST.b   -(a5) ; Change byte?
  20338.       BEQ     PerfBlit3b_16AddSkip15
  20339.       ADD.b   d5,1(a3) ; Add to dest
  20340. PerfBlit3b_16AddSkip15
  20341.       LSR.w   #8,d5
  20342.       TST.b   -(a5) ; Change byte?
  20343.       BEQ     PerfBlit3b_16AddSkip16
  20344.       ADD.b   d5,(a3) ; Add to dest
  20345. PerfBlit3b_16AddSkip16
  20346.       DBRA    d0,PerfBlit3b_16AddXLoop
  20347.     ADD.w d6,a2
  20348.     ADD.w d7,a3
  20349.     ADD.w d7,a5
  20350.     DBRA  d4,PerfBlit3b_16AddYLoop
  20351.   RTS
  20352. PerfBlit3b_16Check5
  20353.   ; Next check
  20354.   RTS
  20355.  
  20356. PerformTile16x16
  20357. ;Do a general block-blit, width&height should be multiple of 16 and lie on 16-byte aligned addresses
  20358. ;Copies data only
  20359. ;d4=Height
  20360. ;d6=Source linemodulo
  20361. ;d7=Dest linemodulo
  20362. ;a2=Source data address
  20363. ;a3=Dest data address
  20364. ;Trashes many
  20365.   TST.b   GeneralCPUmode
  20366.   BEQ     PerfTile16x16_030
  20367. PerfTile16x16_040
  20368.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20369.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20370.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20371.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20372.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20373.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20374.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20375.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20376.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20377.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20378.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20379.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20380.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20381.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20382.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20383.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20384.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20385.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20386.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20387.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20388.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20389.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20390.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20391.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20392.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20393.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20394.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20395.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20396.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20397.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20398.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20399.   RTS;pop
  20400. PerfTile16x16_030
  20401.   MOVEQ.l #16-1,d4 ; YLoopcounter
  20402. PerfTile16x16_030YLoop
  20403.     MOVE.l  (a2)+,(a3)+
  20404.     MOVE.l  (a2)+,(a3)+
  20405.     MOVE.l  (a2)+,(a3)+
  20406.     MOVE.l  (a2)+,(a3)+
  20407.     ADD.w d6,a2 ; linemods
  20408.     ADD.w d7,a3
  20409.     DBRA  d4,PerfTile16x16_030YLoop
  20410.   RTS
  20411.  
  20412. PerformTile32x32
  20413. ;Do a general block-blit, width&height should be multiple of 32 and lie on 32-byte aligned addresses
  20414. ;Copies data only
  20415. ;d4=Height
  20416. ;d6=Source linemodulo
  20417. ;d7=Dest linemodulo
  20418. ;a2=Source data address
  20419. ;a3=Dest data address
  20420. ;Trashes many
  20421.   TST.b   GeneralCPUmode
  20422.   BEQ     PerfTile32x32_030
  20423. PerfTile32x32_040
  20424.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20425.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20426.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20427.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20428.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20429.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20430.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20431.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20432.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20433.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20434.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20435.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20436.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20437.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20438.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20439.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20440.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20441.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20442.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20443.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20444.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20445.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20446.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20447.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20448.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20449.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20450.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20451.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20452.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20453.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20454.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20455.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20456.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20457.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20458.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20459.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20460.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20461.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20462.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20463.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20464.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20465.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20466.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20467.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20468.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20469.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20470.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20471.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20472.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20473.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20474.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20475.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20476.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20477.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20478.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20479.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20480.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20481.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20482.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20483.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20484.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20485.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20486.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20487.   RTS;pop
  20488. PerfTile32x32_030
  20489.   MOVEQ.l #32-1,d4 ; YLoopcounter
  20490. PerfTile32x32_030YLoop
  20491.     MOVE.l  (a2)+,(a3)+
  20492.     MOVE.l  (a2)+,(a3)+
  20493.     MOVE.l  (a2)+,(a3)+
  20494.     MOVE.l  (a2)+,(a3)+
  20495.     MOVE.l  (a2)+,(a3)+
  20496.     MOVE.l  (a2)+,(a3)+
  20497.     MOVE.l  (a2)+,(a3)+
  20498.     MOVE.l  (a2)+,(a3)+
  20499.     ADD.w d6,a2 ; linemods
  20500.     ADD.w d7,a3
  20501.     DBRA  d4,PerfTile32x32_030YLoop
  20502.   RTS
  20503.  
  20504. PerformDoubleTile16x16
  20505. ;Do a general block-blit, width&height should be multiple of 16 and lie on 16-byte aligned addresses
  20506. ;Copies data to data and cookie to stencil
  20507. ;d4=Height
  20508. ;d6=Source linemodulo
  20509. ;d7=Dest linemodulo
  20510. ;a2=Source data address
  20511. ;a3=Dest data address
  20512. ;a4=Source cookie address
  20513. ;a5=Dest stencil address
  20514. ;Trashes many
  20515.   TST.b   GeneralCPUmode
  20516.   BEQ     PerfDoubleTile16x16_030
  20517. PerfDoubleTile16x16_040
  20518.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20519.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20520.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20521.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20522.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20523.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20524.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20525.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20526.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20527.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20528.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20529.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20530.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20531.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20532.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20533.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20534.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20535.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20536.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20537.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20538.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20539.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20540.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20541.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20542.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20543.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20544.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20545.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20546.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20547.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20548.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20549.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20550.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20551.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20552.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20553.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20554.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20555.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20556.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20557.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20558.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20559.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20560.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20561.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20562.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20563.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20564.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20565.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20566.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20567.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20568.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20569.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20570.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20571.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20572.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20573.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20574.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20575.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20576.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20577.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20578.     Dc.l  #_MOVE16_a2_a3 ; move16 copy 16 bytes (a2)+,(a3)+
  20579.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20580.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20581.   RTS;pop
  20582. PerfDoubleTile16x16_030
  20583.   MOVEQ.l #16-1,d4 ; YLoopcounter
  20584.   SUB.w   d6,a4 ; Prepare first modulos
  20585.   SUB.w   d7,a5
  20586. PerfDoubleTile16x16_030YLoop
  20587.     ADD.w   d6,a4
  20588.     MOVE.l  (a2)+,(a3)+
  20589.     ADD.w   d7,a5
  20590.     MOVE.l  (a4)+,(a5)+
  20591.     MOVE.l  (a2)+,(a3)+
  20592.     MOVE.l  (a4)+,(a5)+
  20593.     MOVE.l  (a2)+,(a3)+
  20594.     MOVE.l  (a4)+,(a5)+
  20595.     MOVE.l  (a2)+,(a3)+
  20596.     ADD.w d6,a2
  20597.     MOVE.l  (a4)+,(a5)+
  20598.     ADD.w d7,a3
  20599.     DBRA  d4,PerfDoubleTile16x16_030YLoop
  20600.   RTS
  20601.  
  20602. PerformDoubleTile32x32
  20603. ;Do a general block-blit, width&height should be multiple of 32 and lie on 32-byte aligned addresses
  20604. ;Copies data to data and cookie to stencil
  20605. ;d4=Height
  20606. ;d6=Source linemodulo
  20607. ;d7=Dest linemodulo
  20608. ;a2=Source data address
  20609. ;a3=Dest data address
  20610. ;a4=Source cookie address
  20611. ;a5=Dest stencil address
  20612. ;Trashes many
  20613.   TST.b   GeneralCPUmode
  20614.   BEQ     PerfDoubleTile32x32_030
  20615. PerfDoubleTile32x32_040
  20616.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20617.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20618.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20619.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20620.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20621.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20622.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20623.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20624.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20625.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20626.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20627.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20628.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20629.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20630.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20631.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20632.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20633.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20634.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20635.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20636.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20637.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20638.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20639.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20640.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20641.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20642.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20643.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20644.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20645.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20646.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20647.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20648.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20649.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20650.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20651.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20652.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20653.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20654.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20655.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20656.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20657.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20658.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20659.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20660.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20661.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20662.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20663.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20664.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20665.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20666.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20667.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20668.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20669.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20670.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20671.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20672.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20673.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20674.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20675.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20676.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20677.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20678.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20679.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20680.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20681.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20682.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20683.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20684.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20685.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20686.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20687.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20688.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20689.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20690.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20691.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20692.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20693.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20694.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20695.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20696.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20697.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20698.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20699.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20700.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20701.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20702.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20703.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20704.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20705.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20706.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20707.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20708.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20709.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20710.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20711.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20712.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20713.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20714.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20715.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20716.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20717.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20718.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20719.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20720.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20721.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20722.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20723.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20724.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20725.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20726.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20727.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20728.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20729.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20730.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20731.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20732.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20733.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20734.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20735.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20736.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20737.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20738.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20739.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20740.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20741.     ADD.w d6,a2 : ADD.w d7,a3 ; linemods
  20742.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20743.   RTS;pop
  20744. PerfDoubleTile32x32_030
  20745.   MOVEQ.l #32-1,d4 ; YLoopcounter
  20746.   SUB.w   d6,a4 ; Prepare first modulos
  20747.   SUB.w   d7,a5
  20748. PerfDoubleTile32x32_030YLoop
  20749.     ADD.w d6,a4
  20750.     MOVE.l  (a2)+,(a3)+
  20751.     ADD.w d7,a5
  20752.     MOVE.l  (a4)+,(a5)+
  20753.     MOVE.l  (a2)+,(a3)+
  20754.     MOVE.l  (a4)+,(a5)+
  20755.     MOVE.l  (a2)+,(a3)+
  20756.     MOVE.l  (a4)+,(a5)+
  20757.     MOVE.l  (a2)+,(a3)+
  20758.     MOVE.l  (a4)+,(a5)+
  20759.     MOVE.l  (a2)+,(a3)+
  20760.     MOVE.l  (a4)+,(a5)+
  20761.     MOVE.l  (a2)+,(a3)+
  20762.     MOVE.l  (a4)+,(a5)+
  20763.     MOVE.l  (a2)+,(a3)+
  20764.     MOVE.l  (a4)+,(a5)+
  20765.     MOVE.l  (a2)+,(a3)+
  20766.     ADD.w d6,a2
  20767.     MOVE.l  (a4)+,(a5)+
  20768.     ADD.w d7,a3
  20769.     DBRA  d4,PerfDoubleTile32x32_030YLoop
  20770.   RTS
  20771.  
  20772. PerformTripleTile16x16
  20773. ;Do a general block-blit, width&height should be multiple of 16 and lie on 16-byte aligned addresses
  20774. ;Copies data to data and cookie to stencil, and also data to a second resource's data
  20775. ;d4=Height
  20776. ;d5=Second dest's linemodulo
  20777. ;d6=Source linemodulo
  20778. ;d7=Dest linemodulo
  20779. ;a0=SecondDest data address
  20780. ;a2=Source data address
  20781. ;a3=Dest data address
  20782. ;a4=Source cookie address
  20783. ;a5=Dest stencil address
  20784. ;Trashes many
  20785.   TST.b   GeneralCPUmode
  20786.   BEQ     PerfTripleTile16x16_030
  20787. PerfTripleTile16x16_040
  20788.     MOVEQ.l #16,d0 ; Subtractor
  20789.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  20790.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20791.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20792.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20793.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  20794.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20795.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20796.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20797.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  20798.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20799.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20800.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20801.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  20802.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20803.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20804.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20805.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  20806.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20807.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20808.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20809.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  20810.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20811.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20812.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20813.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  20814.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20815.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20816.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20817.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  20818.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20819.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20820.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20821.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  20822.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20823.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20824.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20825.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  20826.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20827.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20828.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20829.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  20830.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20831.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20832.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20833.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  20834.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20835.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20836.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20837.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  20838.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20839.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20840.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20841.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  20842.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20843.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20844.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20845.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  20846.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20847.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20848.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20849.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  20850.     Dc.l  #_MOVE16_a4_a5 ; move16 copy 16 bytes (a4)+,(a5)+
  20851.   RTS;pop
  20852. PerfTripleTile16x16_030
  20853.   MOVEQ.l #16-1,d4 ; YLoopcounter
  20854.   SUB.w   d6,a4 ; Prepare first modulos
  20855.   SUB.w   d7,a5
  20856. PerfTripleTile16x16_030YLoop
  20857.     ADD.w   d6,a4
  20858.     MOVE.l  (a2),(a3)+
  20859.     ADD.w   d7,a5
  20860.     MOVE.l  (a2)+,(a0)+
  20861.     MOVE.l  (a4)+,(a5)+
  20862.     MOVE.l  (a2),(a3)+
  20863.     MOVE.l  (a2)+,(a0)+
  20864.     MOVE.l  (a4)+,(a5)+
  20865.     MOVE.l  (a2),(a3)+
  20866.     MOVE.l  (a2)+,(a0)+
  20867.     MOVE.l  (a4)+,(a5)+
  20868.     MOVE.l  (a2),(a3)+
  20869.     MOVE.l  (a2)+,(a0)+
  20870.     ADD.w   d7,a3
  20871.     MOVE.l  (a4)+,(a5)+
  20872.     ADD.w   d6,a2
  20873.     ADD.w   d5,a0
  20874.     DBRA  d4,PerfTripleTile16x16_030YLoop
  20875.   RTS
  20876.  
  20877. PerformTripleTile32x32
  20878. ;Do a general block-blit, width&height should be multiple of 32 and lie on 32-byte aligned addresses
  20879. ;Copies data to data and cookie to stencil, and also data to a second resource's data
  20880. ;d4=Height
  20881. ;d5=SecondDest's linemodulo
  20882. ;d6=Source linemodulo
  20883. ;d7=Dest linemodulo
  20884. ;a0=SecondDest's data address
  20885. ;a2=Source data address
  20886. ;a3=Dest data address
  20887. ;a4=Source cookie address
  20888. ;a5=Dest stencil address
  20889. ;Trashes many
  20890.   TST.b   GeneralCPUmode
  20891.   BEQ     PerfTripleTile32x32_030
  20892. PerfTripleTile32x32_040
  20893.     MOVEQ.l #32,d0 ; Subtractor
  20894.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20895.     SUB.w d0,a2
  20896.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  20897.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20898.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20899.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20900.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20901.     SUB.w d0,a2
  20902.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  20903.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20904.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20905.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20906.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20907.     SUB.w d0,a2
  20908.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  20909.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20910.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20911.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20912.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20913.     SUB.w d0,a2
  20914.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  20915.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20916.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20917.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20918.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20919.     SUB.w d0,a2
  20920.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  20921.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20922.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20923.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20924.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20925.     SUB.w d0,a2
  20926.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  20927.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20928.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20929.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20930.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20931.     SUB.w d0,a2
  20932.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  20933.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20934.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20935.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20936.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20937.     SUB.w d0,a2
  20938.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  20939.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20940.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20941.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20942.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20943.     SUB.w d0,a2
  20944.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  20945.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20946.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20947.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20948.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20949.     SUB.w d0,a2
  20950.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  20951.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20952.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20953.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20954.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20955.     SUB.w d0,a2
  20956.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  20957.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20958.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20959.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20960.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20961.     SUB.w d0,a2
  20962.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  20963.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20964.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20965.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20966.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20967.     SUB.w d0,a2
  20968.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  20969.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20970.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20971.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20972.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20973.     SUB.w d0,a2
  20974.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  20975.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20976.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20977.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20978.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20979.     SUB.w d0,a2
  20980.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  20981.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20982.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20983.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20984.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20985.     SUB.w d0,a2
  20986.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  20987.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20988.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20989.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20990.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20991.     SUB.w d0,a2
  20992.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  20993.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  20994.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  20995.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  20996.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  20997.     SUB.w d0,a2
  20998.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  20999.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21000.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  21001.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  21002.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21003.     SUB.w d0,a2
  21004.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21005.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21006.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  21007.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  21008.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21009.     SUB.w d0,a2
  21010.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21011.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21012.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  21013.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  21014.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21015.     SUB.w d0,a2
  21016.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21017.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21018.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  21019.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  21020.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21021.     SUB.w d0,a2
  21022.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21023.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21024.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  21025.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  21026.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21027.     SUB.w d0,a2
  21028.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21029.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21030.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  21031.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  21032.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21033.     SUB.w d0,a2
  21034.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21035.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21036.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  21037.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  21038.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21039.     SUB.w d0,a2
  21040.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21041.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21042.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  21043.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  21044.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21045.     SUB.w d0,a2
  21046.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21047.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21048.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  21049.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  21050.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21051.     SUB.w d0,a2
  21052.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21053.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21054.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  21055.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  21056.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21057.     SUB.w d0,a2
  21058.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21059.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21060.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  21061.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  21062.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21063.     SUB.w d0,a2
  21064.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21065.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21066.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  21067.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  21068.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21069.     SUB.w d0,a2
  21070.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21071.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21072.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  21073.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  21074.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21075.     SUB.w d0,a2
  21076.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21077.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21078.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  21079.     ADD.w d6,a4 : ADD.w d7,a5 ; linemods
  21080.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21081.     SUB.w d0,a2
  21082.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21083.     Dc.l  #_MOVE16_a4_a5 : Dc.l #_MOVE16_a4_a5 ; move16 copy 32 bytes (a4)+,(a5)+
  21084.   RTS;pop
  21085. PerfTripleTile32x32_030
  21086.   MOVEQ.l #32-1,d4 ; YLoopcounter
  21087.   SUB.w   d6,a4 ; Prepare first modulos
  21088.   SUB.w   d7,a5
  21089. PerfTripleTile32x32_030YLoop
  21090.     ADD.w   d6,a4
  21091.     MOVE.l  (a2),(a3)+
  21092.     ADD.w   d7,a5
  21093.     MOVE.l  (a2)+,(a0)+
  21094.     MOVE.l  (a4)+,(a5)+
  21095.     MOVE.l  (a2),(a3)+
  21096.     MOVE.l  (a2)+,(a0)+
  21097.     MOVE.l  (a4)+,(a5)+
  21098.     MOVE.l  (a2),(a3)+
  21099.     MOVE.l  (a2)+,(a0)+
  21100.     MOVE.l  (a4)+,(a5)+
  21101.     MOVE.l  (a2),(a3)+
  21102.     MOVE.l  (a2)+,(a0)+
  21103.     MOVE.l  (a4)+,(a5)+
  21104.     MOVE.l  (a2),(a3)+
  21105.     MOVE.l  (a2)+,(a0)+
  21106.     MOVE.l  (a4)+,(a5)+
  21107.     MOVE.l  (a2),(a3)+
  21108.     MOVE.l  (a2)+,(a0)+
  21109.     MOVE.l  (a4)+,(a5)+
  21110.     MOVE.l  (a2),(a3)+
  21111.     MOVE.l  (a2)+,(a0)+
  21112.     MOVE.l  (a4)+,(a5)+
  21113.     MOVE.l  (a2),(a3)+
  21114.     MOVE.l  (a2)+,(a0)+
  21115.     ADD.w   d7,a3
  21116.     MOVE.l  (a4)+,(a5)+
  21117.     ADD.w   d6,a2
  21118.     ADD.w   d5,a0
  21119.     DBRA    d4,PerfTripleTile32x32_030YLoop
  21120.   RTS
  21121.  
  21122. PerformTile16x16Twice
  21123. ;Do a general block-blit, width&height should be multiple of 16 and lie on 16-byte aligned addresses
  21124. ;Copies data to data and also data to a second resource's data. Cookie is ignored.
  21125. ;d4=Height
  21126. ;d5=Second dest's linemodulo
  21127. ;d6=Source linemodulo
  21128. ;d7=Dest linemodulo
  21129. ;a0=SecondDest data address
  21130. ;a2=Source data address
  21131. ;a3=Dest data address
  21132. ;Trashes many
  21133.   TST.b   GeneralCPUmode
  21134.   BEQ     PerfTile16x16Twice_030
  21135. PerfTile16x16Twice_040
  21136.     MOVEQ.l #16,d0 ; Subtractor
  21137.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  21138.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21139.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  21140.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21141.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  21142.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21143.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  21144.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21145.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  21146.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21147.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  21148.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21149.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  21150.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21151.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  21152.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21153.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  21154.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21155.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  21156.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21157.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  21158.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21159.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  21160.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21161.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  21162.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21163.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  21164.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21165.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  21166.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21167.     Dc.l  #_MOVE16_a2_a3 : SUB.w d0,a2 : Dc.l #_MOVE16_a2_a0 ; move16 copy 16 bytes twice (a2)+,(a3)+ and (a2)+,(a0)+
  21168.   RTS;pop
  21169. PerfTile16x16Twice_030
  21170.   MOVEQ.l #16-1,d4 ; YLoopcounter
  21171. PerfTile16x16Twice_030YLoop
  21172.     MOVE.l  (a2),(a3)+
  21173.     MOVE.l  (a2)+,(a0)+
  21174.     MOVE.l  (a2),(a3)+
  21175.     MOVE.l  (a2)+,(a0)+
  21176.     MOVE.l  (a2),(a3)+
  21177.     MOVE.l  (a2)+,(a0)+
  21178.     MOVE.l  (a2),(a3)+
  21179.     MOVE.l  (a2)+,(a0)+
  21180.     ADD.w d7,a3 ; linemods
  21181.     ADD.w d1,a0
  21182.     ADD.w d6,a2
  21183.     DBRA  d4,PerfTile16x16Twice_030YLoop
  21184.   RTS
  21185.  
  21186. PerformTile32x32Twice
  21187. ;Do a general block-blit, width&height should be multiple of 32 and lie on 32-byte aligned addresses
  21188. ;Copies data to data and also data to a second resource's data. Cookie is ignored.
  21189. ;d4=Height
  21190. ;d5=SecondDest's linemodulo
  21191. ;d6=Source linemodulo
  21192. ;d7=Dest linemodulo
  21193. ;a0=SecondDest's data address
  21194. ;a2=Source data address
  21195. ;a3=Dest data address
  21196. ;Trashes many
  21197.   TST.b   GeneralCPUmode
  21198.   BEQ     PerfTile32x32Twice_030
  21199. PerfTile32x32Twice_040
  21200.     MOVEQ.l #32,d0 ; Subtractor
  21201.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21202.     SUB.w d0,a2
  21203.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21204.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21205.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21206.     SUB.w d0,a2
  21207.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21208.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21209.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21210.     SUB.w d0,a2
  21211.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21212.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21213.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21214.     SUB.w d0,a2
  21215.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21216.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21217.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21218.     SUB.w d0,a2
  21219.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21220.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21221.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21222.     SUB.w d0,a2
  21223.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21224.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21225.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21226.     SUB.w d0,a2
  21227.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21228.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21229.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21230.     SUB.w d0,a2
  21231.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21232.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21233.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21234.     SUB.w d0,a2
  21235.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21236.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21237.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21238.     SUB.w d0,a2
  21239.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21240.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21241.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21242.     SUB.w d0,a2
  21243.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21244.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21245.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21246.     SUB.w d0,a2
  21247.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21248.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21249.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21250.     SUB.w d0,a2
  21251.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21252.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21253.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21254.     SUB.w d0,a2
  21255.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21256.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21257.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21258.     SUB.w d0,a2
  21259.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21260.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21261.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21262.     SUB.w d0,a2
  21263.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21264.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21265.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21266.     SUB.w d0,a2
  21267.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21268.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21269.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21270.     SUB.w d0,a2
  21271.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21272.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21273.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21274.     SUB.w d0,a2
  21275.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21276.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21277.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21278.     SUB.w d0,a2
  21279.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21280.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21281.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21282.     SUB.w d0,a2
  21283.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21284.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21285.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21286.     SUB.w d0,a2
  21287.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21288.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21289.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21290.     SUB.w d0,a2
  21291.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21292.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21293.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21294.     SUB.w d0,a2
  21295.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21296.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21297.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21298.     SUB.w d0,a2
  21299.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21300.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21301.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21302.     SUB.w d0,a2
  21303.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21304.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21305.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21306.     SUB.w d0,a2
  21307.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21308.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21309.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21310.     SUB.w d0,a2
  21311.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21312.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21313.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21314.     SUB.w d0,a2
  21315.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21316.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21317.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21318.     SUB.w d0,a2
  21319.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21320.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21321.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21322.     SUB.w d0,a2
  21323.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21324.     ADD.w d6,a2 : ADD.w d7,a3 : ADD.w d5,a0 ; linemods
  21325.     Dc.l  #_MOVE16_a2_a3 : Dc.l #_MOVE16_a2_a3 ; move16 copy 32 bytes (a2)+,(a3)+
  21326.     SUB.w d0,a2
  21327.     Dc.l  #_MOVE16_a2_a0 : Dc.l #_MOVE16_a2_a0 ; move16 copy 32 bytes (a2)+,(a0)+
  21328.   RTS;pop
  21329. PerfTile32x32Twice_030
  21330.   MOVEQ.l #32-1,d4 ; YLoopcounter
  21331. PerfTile32x32Twice_030YLoop
  21332.     MOVE.l  (a2),(a3)+
  21333.     MOVE.l  (a2)+,(a0)+
  21334.     MOVE.l  (a2),(a3)+
  21335.     MOVE.l  (a2)+,(a0)+
  21336.     MOVE.l  (a2),(a3)+
  21337.     MOVE.l  (a2)+,(a0)+
  21338.     MOVE.l  (a2),(a3)+
  21339.     MOVE.l  (a2)+,(a0)+
  21340.     MOVE.l  (a2),(a3)+
  21341.     MOVE.l  (a2)+,(a0)+
  21342.     MOVE.l  (a2),(a3)+
  21343.     MOVE.l  (a2)+,(a0)+
  21344.     MOVE.l  (a2),(a3)+
  21345.     MOVE.l  (a2)+,(a0)+
  21346.     MOVE.l  (a2),(a3)+
  21347.     MOVE.l  (a2)+,(a0)+
  21348.     ADD.w   d7,a3 ; linemods
  21349.     ADD.w   d1,a0
  21350.     ADD.w   d6,a2
  21351.     DBRA    d4,PerfTile32x32Twice_030YLoop
  21352.   RTS
  21353.  
  21354. PerformCls
  21355. ;Clearscreen an object, with possible clip and wrap
  21356. ;a0=Struct
  21357. ;d1=Colour 0..255
  21358. ;a1=Data address of thing to clear (data or stencil/cookie) within given resource (bitmap or shape)
  21359. ;Trashes d0..d7/a1
  21360.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d7 ; Line modulo
  21361.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Add wrapping bytes?
  21362.   BEQ     PerfClsNoWrap
  21363.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1 ; Position
  21364. PerfClsNoWrap
  21365.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip the cls?
  21366.   BEQ     PerfClsNoClip
  21367.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d2 ; Width
  21368.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d3 ; Height
  21369.   ADD.w   CRsrc_ClipLMod-ChunkyResources(a0),d7 ; Add to modulo
  21370.   ADD.l   CRsrc_ClipBytes-ChunkyResources(a0),a1 ; Add byte offset for topleft
  21371.   BRA     PerfClsSkip
  21372. PerfClsNoClip
  21373.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d2 ; Width
  21374.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d3 ; Height
  21375. PerfClsSkip
  21376.   EXT.l   d7
  21377.   MOVE.b  d1,d6 ; Copy colour byte
  21378.   LSL.w   #8,d6 ; Prepare
  21379.   MOVE.b  d1,d6 ; Copy colour byte
  21380.   SWAP    d6    ; Prepare
  21381.   MOVE.b  d1,d6 ; Copy colour byte
  21382.   LSL.w   #8,d6 ; Prepare
  21383.   MOVE.b  d1,d6 ; Copy colour byte to make 4-pixel longword
  21384.   MOVE.w  d2,d4 ; Copy width
  21385.   LSR.w   #2,d4 ; /4 for longwords
  21386.   SUBQ.w  #1,d4 ; XLoopcounter
  21387.   MOVE.w  d3,d5 ; Copy height
  21388.   SUBQ.w  #1,d5 ; YLoopcounter
  21389.   MOVE.w  _DrawingModeType,d1 ; Get mode
  21390.   TST.l   d7 ; Any modulo?
  21391.   BGT     PerfClsModulo
  21392.   CMP.w   #4,d1 ; MColourMode?
  21393.   BEQ     PerfClsNoModulo ; Do faster non-modulo routine for MColourMode
  21394. PerfClsModulo
  21395.   CMP.w   #4,d1 ; What mode?
  21396.   BLT     PerfClsModuloInvMode
  21397.   BGT     PerfClsModuloNextMode
  21398. PerfClsModuloColour
  21399. PerfClsModuloColourYLoop
  21400.     MOVE.w  d4,d2 ; XLoop
  21401. PerfClsModuloColourXLoop
  21402.       MOVE.l  d6,(a1)+
  21403.       DBRA    d2,PerfClsModuloColourXLoop
  21404.     ADD.w   d7,a1
  21405.     DBRA    d5,PerfClsModuloColourYLoop
  21406.   RTS;pop
  21407. PerfClsModuloInvMode
  21408. PerfClsModuloInvYLoop
  21409.     MOVE.w  d4,d2 ; XLoop
  21410. PerfClsModuloInvXLoop
  21411.       NOT.l   (a1)+
  21412.       DBRA    d2,PerfClsModuloInvXLoop
  21413.     ADD.w   d7,a1
  21414.     DBRA    d5,PerfClsModuloInvYLoop
  21415.   RTS;pop
  21416. PerfClsModuloNextMode
  21417.   CMP.w   #6,d1 ; What mode?
  21418.   BLT     PerfClsModuloReMap
  21419.   BGT     PerfClsModulo_Add
  21420. PerfClsModuloSimpleReMap
  21421.   MOVE.w  CurrentChunkyTable1,d0
  21422.   !GetTableObjectPtr ; Base in a0
  21423.   MOVEQ.l #0,d0 ; init
  21424.   MOVEQ.l #0,d1 ; init
  21425.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0 ; Base of table
  21426.   MOVEQ.l #0,d3 ; init
  21427.   MOVEQ.l #0,d6 ; init
  21428. PerfClsModuloSimpleReMapYLoop
  21429.     MOVE.w  d4,d2 ; XLoop
  21430. PerfClsModuloSimpleReMapXLoop
  21431.       MOVE.b  (a1),d0 ; Get point
  21432.       MOVE.b  0(a0,d0.w),(a1)+
  21433.       MOVE.b  (a1),d1 ; Get point
  21434.       MOVE.b  0(a0,d1.w),(a1)+
  21435.       MOVE.b  (a1),d3 ; Get point
  21436.       MOVE.b  0(a0,d3.w),(a1)+
  21437.       MOVE.b  (a1),d6 ; Get point
  21438.       MOVE.b  0(a0,d6.w),(a1)+
  21439.       DBRA    d2,PerfClsModuloSimpleReMapXLoop
  21440.     ADD.w   d7,a1
  21441.     DBRA    d5,PerfClsModuloSimpleReMapYLoop
  21442.   RTS;pop
  21443. PerfClsModuloReMap
  21444.   MOVE.w  CurrentChunkyTable1,d0
  21445.   !GetTableObjectPtr ; Base in a0
  21446.   AND.l   #$0000FF00,d6 ; Make upper byte of offset
  21447.   MOVE.l  d6,d0 ; init
  21448.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0 ; Base of table
  21449.   MOVE.l  d6,d1 ; init
  21450.   MOVE.l  d6,d3 ; init
  21451. PerfClsModuloReMapYLoop
  21452.     MOVE.w  d4,d2 ; XLoop
  21453. PerfClsModuloReMapXLoop
  21454.       MOVE.b  (a1),d0 ; Get point
  21455.       MOVE.b  0(a0,d0.l),(a1)+
  21456.       MOVE.b  (a1),d1 ; Get point
  21457.       MOVE.b  0(a0,d1.l),(a1)+
  21458.       MOVE.b  (a1),d3 ; Get point
  21459.       MOVE.b  0(a0,d3.l),(a1)+
  21460.       MOVE.b  (a1),d6 ; Get point
  21461.       MOVE.b  0(a0,d6.l),(a1)+
  21462.       DBRA    d2,PerfClsModuloReMapXLoop
  21463.       ADD.w   d7,a1
  21464.     DBRA    d5,PerfClsModuloReMapYLoop
  21465.   RTS;pop
  21466. PerfClsModulo_Add
  21467. PerfClsModuloAddYLoop
  21468.     MOVE.w  d4,d2 ; XLoop
  21469. PerfClsModuloAddXLoop
  21470.       ADD.b   d6,(a1)+ ; Add
  21471.       ADD.b   d6,(a1)+ ; Add
  21472.       ADD.b   d6,(a1)+ ; Add
  21473.       ADD.b   d6,(a1)+ ; Add
  21474.       DBRA    d2,PerfClsModuloAddXLoop
  21475.     ADD.w   d7,a1
  21476.     DBRA    d5,PerfClsModuloAddYLoop
  21477.   RTS;pop
  21478. PerfClsNoModulo
  21479.   ADD.w   d7,d2 ; Total width bytes
  21480.   MULU    d2,d3 ; Total bytes
  21481.   ADD.l   d3,a1 ; Point to end
  21482.   MOVE.l  d3,d1 ; Copy total bytes
  21483.   MOVE.l  d3,d0 ; Copy total bytes
  21484.   LSR.l   #4+2+2,d1 ; Groups of 16 bytes -> Groups of 16 longwords -> Groups of 4 groups of 16 longwords (64 longwords)
  21485.   SUBQ.l  #1,d1 ; Group loopcounter
  21486.   AND.l   #$000000FF,d0 ; Leftover bytes (8 bits)
  21487.   LSR.l   #2,d0 ; Longwords
  21488.   SUBQ.l  #1,d0 ; Leftover loopcounter
  21489.   MOVEM.l a3/a4,-(a7) ; Store
  21490.   MOVE.l  d6,d2 ; 2 regs
  21491.   MOVE.l  d6,d3 ; 3 regs
  21492.   MOVE.l  d6,d4 ; 4 regs
  21493.   MOVE.l  d6,d7 ; 5 regs
  21494.   MOVE.l  d6,a2 ; 6 regs
  21495.   MOVE.l  d6,a3 ; 7 regs
  21496.   MOVE.l  d6,a4 ; 8 regs
  21497. PerfClsGroupsLoop
  21498.     MOVEM.l d2-d4/d6/d7/a2-a4,-(a1) ; Clear 8 longwords
  21499.     MOVEM.l d2-d4/d6/d7/a2-a4,-(a1) ; Clear 8 longwords (16 total)
  21500.     MOVEM.l d2-d4/d6/d7/a2-a4,-(a1) ; Clear 8 longwords
  21501.     MOVEM.l d2-d4/d6/d7/a2-a4,-(a1) ; Clear 8 longwords (32 total)
  21502.     MOVEM.l d2-d4/d6/d7/a2-a4,-(a1) ; Clear 8 longwords
  21503.     MOVEM.l d2-d4/d6/d7/a2-a4,-(a1) ; Clear 8 longwords (48 total)
  21504.     MOVEM.l d2-d4/d6/d7/a2-a4,-(a1) ; Clear 8 longwords
  21505.     MOVEM.l d2-d4/d6/d7/a2-a4,-(a1) ; Clear 8 longwords (64 total) 256 bytes
  21506.     DBRA    d1,PerfClsGroupsLoop
  21507.   TST.l   d0 ; Leftover?
  21508.   BLT     PerfClsSkip2
  21509. PerfClsLeftoverLoop
  21510.     MOVE.l  d2,-(a1) ; Clear a longword
  21511.     DBRA    d0,PerfClsLeftoverLoop
  21512. PerfClsSkip2
  21513.   MOVEM.l (a7)+,a3/a4 ; Restore
  21514.   RTS
  21515.  
  21516. PerformBoxF
  21517. ;Draw a filled box within an object
  21518. ;a0=Struct
  21519. ;d0=X1
  21520. ;d1=Y1
  21521. ;d2=Width
  21522. ;d3=Height
  21523. ;d4=Colour 0..255
  21524. ;a1=Data address of thing to clear (data or stencil/cookie) within given resource (bitmap or shape)
  21525. ;Trashes d0..d7/a1
  21526.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d7 ; Line modulo
  21527.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Add wrapping bytes?
  21528.   BEQ     PerfBoxFNoWrap
  21529.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1 ; Position
  21530. PerfBoxFNoWrap
  21531.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d6 ; Get width
  21532.   MOVE.w  d6,d5 ; Store
  21533.   ADD.w   d7,d5 ; Total width
  21534.   SUB.w   d2,d6 ; Extra linemodulo
  21535.   ADD.w   d6,d7 ; Total modulo
  21536.   MOVE.w  d1,d6 ; Copy Y1
  21537.   MULU    d5,d6 ; Y byte offset
  21538.   ADD.w   d0,a1 ; Topleft corner bytes to add
  21539.   ADD.l   d6,a1 ; Position
  21540.   EXT.l   d7
  21541.   MOVE.b  d4,d6 ; Copy colour byte
  21542.   LSL.w   #8,d6 ; Prepare
  21543.   MOVE.b  d4,d6 ; Copy colour byte
  21544.   SWAP    d6    ; Prepare
  21545.   MOVE.b  d4,d6 ; Copy colour byte
  21546.   LSL.w   #8,d6 ; Prepare
  21547.   MOVE.b  d4,d6 ; Copy colour byte to make 4-pixel longword
  21548.   MOVE.w  d2,d4 ; Copy width
  21549.   AND.b   #$FC,d4 ; Multiple of longwords
  21550.   MOVE.w  d2,d0 ; Copy width
  21551.   MOVE.w  d3,d5 ; Copy height
  21552.   SUB.w   d4,d0 ; Extra bytes?
  21553.   ADD.w   d7,d2 ; Total width bytes
  21554.   SUBQ.w  #1,d0 ; Byte XLoopcounter
  21555.   MULU    d2,d3 ; Total bytes including modulos, point to end
  21556.   LSR.w   #2,d4 ; /4 for longwords
  21557.   SUBQ.w  #1,d4 ; Longword XLoopcounter
  21558.   SUB.l   d7,d3 ; Minus modulo on last line
  21559.   SUBQ.w  #1,d5 ; YLoopcounter
  21560.   ADD.l   d3,a1 ; Point to end
  21561.   MOVE.w  _DrawingModeType,d3 ; Get mode
  21562.   CMP.b   #4,d3 ; What mode?
  21563.   BLT     PerfBoxFInv
  21564.   BGT     PerfBoxFNextMode
  21565. PerfBoxFColourYLoop
  21566.     MOVE.w  d4,d2 ; XLoop for longwords
  21567.     BLT     PerfBoxFColourNoLongwords
  21568. PerfBoxFColourXLoop
  21569.       MOVE.l  d6,-(a1) ; Write longword
  21570.       DBRA    d2,PerfBoxFColourXLoop
  21571. PerfBoxFColourNoLongwords
  21572.     MOVE.w  d0,d2 ; XLoop for bytes
  21573.     BLT     PerfBoxFColourNoBytes
  21574. PerfBoxFColourXLoop2
  21575.       MOVE.b  d6,-(a1) ; Write byte
  21576.       DBRA    d2,PerfBoxFColourXLoop2
  21577. PerfBoxFColourNoBytes
  21578.     SUB.w   d7,a1 ; Modulo
  21579.     DBRA    d5,PerfBoxFColourYLoop
  21580.   RTS;pop
  21581. PerfBoxFInv
  21582. PerfBoxFInvYLoop
  21583.     MOVE.w  d4,d2 ; XLoop for longwords
  21584.     BLT     PerfBoxFInvNoLongwords
  21585. PerfBoxFInvXLoop
  21586.       NOT.l   -(a1) ; Write longword
  21587.       DBRA    d2,PerfBoxFInvXLoop
  21588. PerfBoxFInvNoLongwords
  21589.     MOVE.w  d0,d2 ; XLoop for bytes
  21590.     BLT     PerfBoxFInvNoBytes
  21591. PerfBoxFInvXLoop2
  21592.       NOT.b   -(a1) ; Write byte
  21593.       DBRA    d2,PerfBoxFInvXLoop2
  21594. PerfBoxFInvNoBytes
  21595.     SUB.w   d7,a1 ; Modulo
  21596.     DBRA    d5,PerfBoxFInvYLoop
  21597.   RTS;pop
  21598. PerfBoxFNextMode
  21599.   CMP.b   #6,d3 ; What mode?
  21600.   BLT     PerfBoxFReMap
  21601.   BGT     PerfBoxF_Add
  21602. PerfBoxFSimpleReMap
  21603.   MOVE.w  CurrentChunkyTable1,d3
  21604.   EXG.l   d3,d0
  21605.   !GetTableObjectPtr ; base in a0
  21606.   MOVE.l  d3,d0
  21607.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0 ; Base of table
  21608.   MOVEQ.l #0,d6 ; Init
  21609.   MOVEQ.l #0,d1 ; Init
  21610.   MOVEQ.l #0,d3 ; Init
  21611. PerfBoxFSimpleReMapYLoop
  21612.     MOVE.w  d4,d2 ; XLoop for longwords
  21613.     BLT     PerfBoxFSimpleReMapNoLongwords
  21614. PerfBoxFSimpleReMapXLoop
  21615.       SUB.w   #4,a1
  21616.       MOVE.b  (a1),d1 ; Get byte
  21617.       MOVE.b  0(a0,d1.w),(a1) ; Write SimpleReMap
  21618.       MOVE.b  1(a1),d6 ; Get byte
  21619.       MOVE.b  0(a0,d6.w),1(a1) ; Write SimpleReMap
  21620.       MOVE.b  2(a1),d3 ; Get byte
  21621.       MOVE.b  0(a0,d3.w),2(a1) ; Write SimpleReMap
  21622.       MOVE.b  3(a1),d1 ; Get byte
  21623.       MOVE.b  0(a0,d1.w),3(a1) ; Write SimpleReMap
  21624.       DBRA    d2,PerfBoxFSimpleReMapXLoop
  21625. PerfBoxFSimpleReMapNoLongwords
  21626.     MOVE.w  d0,d2 ; XLoop for bytes
  21627.     BLT     PerfBoxFSimpleReMapNoBytes
  21628. PerfBoxFSimpleReMapXLoop2
  21629.       MOVE.b  -(a1),d1 ; Get byte
  21630.       MOVE.b  0(a0,d1.w),(a1) ; Write SimpleReMap
  21631.       DBRA    d2,PerfBoxFSimpleReMapXLoop2
  21632. PerfBoxFSimpleReMapNoBytes
  21633.     SUB.w   d7,a1 ; Modulo
  21634.     DBRA    d5,PerfBoxFSimpleReMapYLoop
  21635.   RTS;pop
  21636. PerfBoxFReMap
  21637.   MOVE.w  CurrentChunkyTable1,d3
  21638.   EXG.l   d3,d0
  21639.   !GetTableObjectPtr ; base in a0
  21640.   MOVE.l  d3,d0
  21641.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0 ; Base of table
  21642.   AND.l   #$0000FF00,d6 ; Prepare
  21643.   MOVE.l  d6,d1 ; Init
  21644.   MOVE.l  d6,d3 ; Init
  21645. PerfBoxFReMapYLoop
  21646.     MOVE.w  d4,d2 ; XLoop for longwords
  21647.     BLT     PerfBoxFReMapNoLongwords
  21648. PerfBoxFReMapXLoop
  21649.       SUB.w   #4,a1
  21650.       MOVE.b  (a1),d1 ; Get byte
  21651.       MOVE.b  0(a0,d1.l),(a1) ; Write ReMap
  21652.       MOVE.b  1(a1),d6 ; Get byte
  21653.       MOVE.b  0(a0,d6.l),1(a1) ; Write ReMap
  21654.       MOVE.b  2(a1),d3 ; Get byte
  21655.       MOVE.b  0(a0,d3.l),2(a1) ; Write ReMap
  21656.       MOVE.b  3(a1),d1 ; Get byte
  21657.       MOVE.b  0(a0,d1.l),3(a1) ; Write ReMap
  21658.       DBRA    d2,PerfBoxFReMapXLoop
  21659. PerfBoxFReMapNoLongwords
  21660.     MOVE.w  d0,d2 ; XLoop for bytes
  21661.     BLT     PerfBoxFReMapNoBytes
  21662. PerfBoxFReMapXLoop2
  21663.       MOVE.b  -(a1),d1 ; Get byte
  21664.       MOVE.b  0(a0,d1.l),(a1) ; Write ReMap
  21665.       DBRA    d2,PerfBoxFReMapXLoop2
  21666. PerfBoxFReMapNoBytes
  21667.     SUB.w   d7,a1 ; Modulo
  21668.     DBRA    d5,PerfBoxFReMapYLoop
  21669.   RTS;pop
  21670. PerfBoxF_Add
  21671. PerfBoxFAddYLoop
  21672.     MOVE.w  d4,d2 ; XLoop for longwords
  21673.     BLT     PerfBoxFAddNoLongwords
  21674. PerfBoxFAddXLoop
  21675.       ADD.b   d6,-(a1) ; Add
  21676.       ADD.b   d6,-(a1) ; Add
  21677.       ADD.b   d6,-(a1) ; Add
  21678.       ADD.b   d6,-(a1) ; Add
  21679.       DBRA    d2,PerfBoxFAddXLoop
  21680. PerfBoxFAddNoLongwords
  21681.     MOVE.w  d0,d2 ; XLoop for bytes
  21682.     BLT     PerfBoxFAddNoBytes
  21683. PerfBoxFAddXLoop2
  21684.       ADD.b   d6,-(a1) ; Add
  21685.       DBRA    d2,PerfBoxFAddXLoop2
  21686. PerfBoxFAddNoBytes
  21687.     SUB.w   d7,a1 ; Modulo
  21688.     DBRA    d5,PerfBoxFAddYLoop
  21689.   RTS;pop
  21690.  
  21691. PerformBox
  21692. ;Draw an unfilled box within an object
  21693. ;a0=Struct
  21694. ;d0=X1
  21695. ;d1=Y1
  21696. ;d2=Width
  21697. ;d3=Height
  21698. ;d4=Colour 0..255
  21699. ;a1=Data address of thing to clear (data or stencil/cookie) within given resource (bitmap or shape)
  21700. ;Trashes d0..d7/a1
  21701.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d7 ; Line modulo
  21702.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Add wrapping bytes?
  21703.   BEQ     PerfBoxNoWrap
  21704.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1 ; Position
  21705. PerfBoxNoWrap
  21706.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d6 ; Get width
  21707.   MOVE.w  d6,d5 ; Store
  21708.   ADD.w   d7,d5 ; Total width
  21709.   SUB.w   d2,d6 ; Extra linemodulo
  21710.   ADD.w   d6,d7 ; Total modulo
  21711.   MOVE.w  d1,d6 ; Copy Y1
  21712.   MULU    d5,d6 ; Y byte offset
  21713.   ADD.w   d0,a1 ; Topleft corner bytes to add
  21714.   ADD.l   d6,a1 ; Position
  21715.   EXT.l   d7
  21716.   MOVE.b  d4,d6 ; Copy colour byte
  21717.   LSL.w   #8,d6 ; Prepare
  21718.   MOVE.b  d4,d6 ; Copy colour byte
  21719.   SWAP    d6    ; Prepare
  21720.   MOVE.b  d4,d6 ; Copy colour byte
  21721.   LSL.w   #8,d6 ; Prepare
  21722.   MOVE.b  d4,d6 ; Copy colour byte to make 4-pixel longword
  21723.   MOVE.w  d2,d4 ; Copy width
  21724.   MOVE.w  d2,a2 ; Store width
  21725.   AND.b   #$FC,d4 ; Multiple of longwords
  21726.   MOVE.w  d2,d0 ; Copy width
  21727.   SUB.w   d4,d0 ; Extra bytes?
  21728.   SUBQ.w  #1,d0 ; Byte XLoopcounter
  21729.   LSR.w   #2,d4 ; /4 for longwords
  21730.   SUBQ.w  #1,d4 ; Longword XLoopcounter
  21731.   MOVE.w  d3,d5 ; Copy height
  21732.   SUBQ.w  #1,d5 ; YLoopcounter
  21733.   ADD.w   d7,d2 ; Total width bytes
  21734.   MULU    d2,d3 ; Total bytes including modulos, point to end
  21735.   SUB.l   d7,d3 ; Minus modulo on last line
  21736.   ADD.l   d3,a1 ; Point to end
  21737.   MOVE.w  a2,d3 ; Get Width
  21738.   SUBQ.w  #1,d3 ; 1 byte is decremented already
  21739.   MOVE.w  _DrawingModeType,d1 ; Get mode
  21740.   CMP.b   #4,d1 ; What mode?
  21741.   BLT     PerfBoxInv
  21742.   BGT     PerfBoxNextMode
  21743. PerfBoxColourRow
  21744.   MOVE.w  d4,d2 ; XLoop for longwords
  21745.   BLT     PerfBoxColourNoLongwords
  21746. PerfBoxColourXLoop
  21747.     MOVE.l  d6,-(a1) ; Write longword
  21748.     DBRA    d2,PerfBoxColourXLoop
  21749. PerfBoxColourNoLongwords
  21750.   MOVE.w  d0,d2 ; XLoop for bytes
  21751.   BLT     PerfBoxColourNoBytes
  21752. PerfBoxColourXLoop2
  21753.     MOVE.b  d6,-(a1) ; Write byte
  21754.     DBRA    d2,PerfBoxColourXLoop2
  21755. PerfBoxColourNoBytes
  21756.   SUB.w   d7,a1 ; Modulo
  21757.   SUBQ.w  #1,d5 ; YLoop
  21758.   BLT     PerfBoxColourDone
  21759.   BEQ     PerfBoxColourRow
  21760. PerfBoxColourColumns
  21761.   SUBQ.w  #1,d5 ; Prepare loop
  21762.   TST.w   d3 ; 1 column only?
  21763.   BEQ     PerfBoxColourColumnYLoop
  21764. PerfBoxColourColumnsYLoop
  21765.     MOVE.b  d6,-(a1) ; Righthand column
  21766.     SUB.w   d3,a1 ; Point to left
  21767.     MOVE.b  d6,(a1) ; Lefthand column
  21768.     SUB.w   d7,a1 ; Modulo
  21769.     DBRA    d5,PerfBoxColourColumnsYLoop ; Repeat until counter is 0, leaving one line left
  21770.   BRA     PerfBoxColourRow
  21771. PerfBoxColourColumnYLoop
  21772.     MOVE.b  d6,-(a1) ; Righthand column
  21773.     SUB.w   d7,a1 ; Modulo
  21774.     DBRA    d5,PerfBoxColourColumnYLoop ; Repeat until counter is 0, leaving one line left
  21775.   BRA     PerfBoxColourRow
  21776. PerfBoxColourDone
  21777.   RTS;pop
  21778. PerfBoxInv
  21779. PerfBoxInvRow
  21780.   MOVE.w  d4,d2 ; XLoop for longwords
  21781.   BLT     PerfBoxInvNoLongwords
  21782. PerfBoxInvXLoop
  21783.     NOT.l   -(a1) ; Write longword
  21784.     DBRA    d2,PerfBoxInvXLoop
  21785. PerfBoxInvNoLongwords
  21786.   MOVE.w  d0,d2 ; XLoop for bytes
  21787.   BLT     PerfBoxInvNoBytes
  21788. PerfBoxInvXLoop2
  21789.     NOT.b   -(a1) ; Write byte
  21790.     DBRA    d2,PerfBoxInvXLoop2
  21791. PerfBoxInvNoBytes
  21792.   SUB.w   d7,a1 ; Modulo
  21793.   SUBQ.w  #1,d5 ; YLoop
  21794.   BLT     PerfBoxInvDone
  21795.   BEQ     PerfBoxInvRow
  21796. PerfBoxInvColumns
  21797.   SUBQ.w  #1,d5 ; Prepare loop
  21798.   TST.w   d3 ; 1 column only?
  21799.   BEQ     PerfBoxInvColumnYLoop
  21800. PerfBoxInvColumnsYLoop
  21801.     NOT.b   -(a1) ; Righthand column
  21802.     SUB.w   d3,a1 ; Point to left
  21803.     NOT.b   (a1) ; Lefthand column
  21804.     SUB.w   d7,a1 ; Modulo
  21805.     DBRA    d5,PerfBoxInvColumnsYLoop ; Repeat until counter is 0, leaving one line left
  21806.   BRA     PerfBoxInvRow
  21807. PerfBoxInvColumnYLoop
  21808.     NOT.b   -(a1) ; Righthand column
  21809.     SUB.w   d7,a1 ; Modulo
  21810.     DBRA    d5,PerfBoxInvColumnYLoop ; Repeat until counter is 0, leaving one line left
  21811.   BRA     PerfBoxInvRow
  21812. PerfBoxInvDone
  21813.   RTS;pop
  21814. PerfBoxNextMode
  21815.   CMP.b   #6,d1 ; What mode?
  21816.   BLT     PerfBoxReMap
  21817.   BGT     PerfBoxAdd
  21818. PerfBoxSimpleReMap
  21819.   MOVE.w  CurrentChunkyTable1,d1
  21820.   EXG.l   d1,d0
  21821.   !GetTableObjectPtr ; Base in a0
  21822.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0 ; Base of table
  21823.   MOVE.l  d1,d0
  21824.   MOVEQ.l #0,d1 ; Init
  21825.   MOVEQ.l #0,d6 ; Init
  21826. PerfBoxSimpleReMapRow
  21827.   MOVE.w  d4,d2 ; XLoop for longwords
  21828.   BLT     PerfBoxSimpleReMapNoLongwords
  21829. PerfBoxSimpleReMapXLoop
  21830.     SUB.w   #4,a1
  21831.     MOVE.b  (a1),d1 ; Get point
  21832.     MOVE.b  0(a0,d1.w),(a1) ; Plot SimpleReMap
  21833.     MOVE.b  1(a1),d6 ; Get point
  21834.     MOVE.b  0(a0,d6.w),1(a1) ; Plot SimpleReMap
  21835.     MOVE.b  2(a1),d1 ; Get point
  21836.     MOVE.b  0(a0,d1.w),2(a1) ; Plot SimpleReMap
  21837.     MOVE.b  3(a1),d6 ; Get point
  21838.     MOVE.b  0(a0,d6.w),3(a1) ; Plot SimpleReMap
  21839.     DBRA    d2,PerfBoxSimpleReMapXLoop
  21840. PerfBoxSimpleReMapNoLongwords
  21841.   MOVE.w  d0,d2 ; XLoop for bytes
  21842.   BLT     PerfBoxSimpleReMapNoBytes
  21843. PerfBoxSimpleReMapXLoop2
  21844.     MOVE.b  -(a1),d1 ; Get point
  21845.     MOVE.b  0(a0,d1.w),(a1) ; Plot SimpleReMap
  21846.     DBRA    d2,PerfBoxSimpleReMapXLoop2
  21847. PerfBoxSimpleReMapNoBytes
  21848.   SUB.w   d7,a1 ; Modulo
  21849.   SUBQ.w  #1,d5 ; YLoop
  21850.   BLT     PerfBoxSimpleReMapDone
  21851.   BEQ     PerfBoxSimpleReMapRow
  21852. PerfBoxSimpleReMapColumns
  21853.   SUBQ.w  #1,d5 ; Prepare loop
  21854.   TST.w   d3 ; 1 column only?
  21855.   BEQ     PerfBoxSimpleReMapColumnYLoop
  21856. PerfBoxSimpleReMapColumnsYLoop
  21857.     MOVE.b  -(a1),d1 ; Get point
  21858.     MOVE.b  0(a0,d1.w),(a1) ; Plot SimpleReMap
  21859.     SUB.w   d3,a1 ; Point to left
  21860.     MOVE.b  (a1),d6 ; Get point
  21861.     MOVE.b  0(a0,d6.w),(a1) ; Plot SimpleReMap
  21862.     SUB.w   d7,a1 ; Modulo
  21863.     DBRA    d5,PerfBoxSimpleReMapColumnsYLoop ; Repeat until counter is 0, leaving one line left
  21864.   BRA     PerfBoxSimpleReMapRow
  21865. PerfBoxSimpleReMapColumnYLoop
  21866.     MOVE.b  -(a1),d1 ; Get point
  21867.     MOVE.b  0(a0,d1.w),(a1) ; Plot SimpleReMap
  21868.     SUB.w   d7,a1 ; Modulo
  21869.     DBRA    d5,PerfBoxSimpleReMapColumnYLoop ; Repeat until counter is 0, leaving one line left
  21870.   BRA     PerfBoxSimpleReMapRow
  21871. PerfBoxSimpleReMapDone
  21872.   RTS;pop
  21873. PerfBoxReMap
  21874.   MOVE.w  CurrentChunkyTable1,d1
  21875.   EXG.l   d1,d0
  21876.   !GetTableObjectPtr ; Base in a0
  21877.   MOVE.l  CTable_LMem-ChunkyTables(a0),a0 ; Base of table
  21878.   MOVE.l  d1,d0
  21879.   AND.l   #$0000FF00,d6 ; Prepare
  21880.   MOVE.l  d6,d1 ; Init
  21881. PerfBoxReMapRow
  21882.   MOVE.w  d4,d2 ; XLoop for longwords
  21883.   BLT     PerfBoxReMapNoLongwords
  21884. PerfBoxReMapXLoop
  21885.     SUB.w   #4,a1
  21886.     MOVE.b  (a1),d1 ; Get point
  21887.     MOVE.b  0(a0,d1.l),(a1) ; Plot SimpleReMap
  21888.     MOVE.b  1(a1),d6 ; Get point
  21889.     MOVE.b  0(a0,d6.l),1(a1) ; Plot SimpleReMap
  21890.     MOVE.b  2(a1),d1 ; Get point
  21891.     MOVE.b  0(a0,d1.l),2(a1) ; Plot SimpleReMap
  21892.     MOVE.b  3(a1),d6 ; Get point
  21893.     MOVE.b  0(a0,d6.l),3(a1) ; Plot SimpleReMap
  21894.     DBRA    d2,PerfBoxReMapXLoop
  21895. PerfBoxReMapNoLongwords
  21896.   MOVE.w  d0,d2 ; XLoop for bytes
  21897.   BLT     PerfBoxReMapNoBytes
  21898. PerfBoxReMapXLoop2
  21899.     MOVE.b  -(a1),d1 ; Get point
  21900.     MOVE.b  0(a0,d1.l),(a1) ; Plot SimpleReMap
  21901.     DBRA    d2,PerfBoxReMapXLoop2
  21902. PerfBoxReMapNoBytes
  21903.   SUB.w   d7,a1 ; Modulo
  21904.   SUBQ.w  #1,d5 ; YLoop
  21905.   BLT     PerfBoxReMapDone
  21906.   BEQ     PerfBoxReMapRow
  21907. PerfBoxReMapColumns
  21908.   SUBQ.w  #1,d5 ; Prepare loop
  21909.   TST.w   d3 ; 1 column only?
  21910.   BEQ     PerfBoxReMapColumnYLoop
  21911. PerfBoxReMapColumnsYLoop
  21912.     MOVE.b  -(a1),d1 ; Get point
  21913.     MOVE.b  0(a0,d1.l),(a1) ; Plot SimpleReMap
  21914.     SUB.w   d3,a1 ; Point to left
  21915.     MOVE.b  (a1),d6 ; Get point
  21916.     MOVE.b  0(a0,d6.l),(a1) ; Plot SimpleReMap
  21917.     SUB.w   d7,a1 ; Modulo
  21918.     DBRA    d5,PerfBoxReMapColumnsYLoop ; Repeat until counter is 0, leaving one line left
  21919.   BRA     PerfBoxReMapRow
  21920. PerfBoxReMapColumnYLoop
  21921.     MOVE.b  -(a1),d1 ; Get point
  21922.     MOVE.b  0(a0,d1.l),(a1) ; Plot SimpleReMap
  21923.     SUB.w   d7,a1 ; Modulo
  21924.     DBRA    d5,PerfBoxReMapColumnYLoop ; Repeat until counter is 0, leaving one line left
  21925.   BRA     PerfBoxReMapRow
  21926. PerfBoxReMapDone
  21927.   RTS;pop
  21928. PerfBoxAdd
  21929. PerfBoxAddRow
  21930.   MOVE.w  d4,d2 ; XLoop for longwords
  21931.   BLT     PerfBoxAddNoLongwords
  21932. PerfBoxAddXLoop
  21933.     ADD.b   d6,-(a1) ; Add
  21934.     ADD.b   d6,-(a1) ; Add
  21935.     ADD.b   d6,-(a1) ; Add
  21936.     ADD.b   d6,-(a1) ; Add
  21937.     DBRA    d2,PerfBoxAddXLoop
  21938. PerfBoxAddNoLongwords
  21939.   MOVE.w  d0,d2 ; XLoop for bytes
  21940.   BLT     PerfBoxAddNoBytes
  21941. PerfBoxAddXLoop2
  21942.     ADD.b   d6,-(a1) ; Add
  21943.     DBRA    d2,PerfBoxAddXLoop2
  21944. PerfBoxAddNoBytes
  21945.   SUB.w   d7,a1 ; Modulo
  21946.   SUBQ.w  #1,d5 ; YLoop
  21947.   BLT     PerfBoxAddDone
  21948.   BEQ     PerfBoxAddRow
  21949. PerfBoxAddColumns
  21950.   SUBQ.w  #1,d5 ; Prepare loop
  21951.   TST.w   d3 ; 1 column only?
  21952.   BEQ     PerfBoxAddColumnYLoop
  21953. PerfBoxAddColumnsYLoop
  21954.     ADD.b   d6,-(a1) ; Add
  21955.     SUB.w   d3,a1 ; Point to left
  21956.     ADD.b   d6,(a1) ; Add
  21957.     SUB.w   d7,a1 ; Modulo
  21958.     DBRA    d5,PerfBoxAddColumnsYLoop ; Repeat until counter is 0, leaving one line left
  21959.   BRA     PerfBoxAddRow
  21960. PerfBoxAddColumnYLoop
  21961.     ADD.b   d6,-(a1) ; Add
  21962.     SUB.w   d7,a1 ; Modulo
  21963.     DBRA    d5,PerfBoxAddColumnYLoop ; Repeat until counter is 0, leaving one line left
  21964.   BRA     PerfBoxAddRow
  21965. PerfBoxAddDone
  21966.   RTS;pop
  21967.  
  21968. PerformPlanar16ToChunky
  21969. ;Convert planar data to chunky data. Width must be multiples of 16
  21970. ;Heavy trashes
  21971. ;a0=Struct
  21972. ;a1=Chunky address
  21973. ;d1=Planar address
  21974. ;d2=OpWidth
  21975. ;d3=OpHeight
  21976. ;d4=PlanarWidth
  21977. ;d5=PlanarHeight
  21978. ;d7=Chunky dest modulo
  21979.   MOVEM.l a3-a6,-(a7) ; Store
  21980.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d6
  21981.   SUB.w   d2,d6 ; Extra linemod
  21982.   ADD.w   d6,d7 ; Total dest linemod
  21983.   MOVE.w  d7,a6 ; Store
  21984.   MOVE.w  d4,d0 ; Copy planar width
  21985.   SUB.w   d2,d4 ; extra planar linemod
  21986.   LSR.w   #3,d4 ; Linemod in bytes
  21987.   MOVE.w  d4,a5 ; Planar linemod
  21988.   MULU    d5,d0 ; Bitplane
  21989.   LSR.l   #3,d0 ; d0=Bitplane bytesize
  21990.   MOVE.l  a1,a0 ; a0=Chunky dest data
  21991.   MOVE.l  d1,a1 ; a1=Bitplane 0
  21992.   LSR.w   #4,d2 ; Width in planar words or groups of 16 chunky pixels
  21993.   SUBQ.w  #1,d2 ; XLoopcounter
  21994.   SUBQ.w  #1,d3 ; YLoopcounter
  21995.   MOVE.l  d0,a3 ; Store plane adder
  21996.   LSL.l   #3,d0 ; Adder*8
  21997.   SUB.l   a3,d0 ; Adder*7 to find plane 7
  21998.   ADD.l   d0,a1 ; a1=Bitplane 7
  21999. PerfPlanar16ToChunkyYLoop
  22000.     SWAP    d3
  22001.     MOVE.w  d2,d3
  22002.     SWAP    d3
  22003.     MOVE.l  d3,a4 ; Store
  22004. PerfPlanar16ToChunkyXLoop
  22005.       SWAP    d2 ; Store (upper word)
  22006.  
  22007.       MOVE.l  a1,a2 ; Store
  22008.       MOVE.w  (a1),d0 ; Get bitplane 0 data 16 pixels
  22009.       SUB.l   a3,a1 ; Next bitplane
  22010.       ROL.l   #8,d4 ; First group of bytes in register d4
  22011.       MOVE.w  (a1),d1 ; Get bitplane 1 data 16 pixels
  22012.       SUB.l   a3,a1 ; Next bitplane
  22013.       ADD.w   d0,d0 ; Get bit into extend
  22014.       ADDX.b  d4,d4 ; Put bit into chunky byte 0
  22015.       MOVE.w  (a1),d2 ; Get bitplane 2 data 16 pixels
  22016.       SUB.l   a3,a1 ; Next bitplane
  22017.       ADD.w   d1,d1
  22018.       ADDX.b  d4,d4
  22019.       MOVE.w  (a1),d3 ; Get bitplane 3 data 16 pixels
  22020.       ADD.w   d2,d2
  22021.       ADDX.b  d4,d4
  22022.       SUB.l   a3,a1 ; Next bitplane
  22023.       ADD.w   d3,d3
  22024.       ADDX.b  d4,d4
  22025.  
  22026.       ROL.l   #8,d4 ; Get next byte
  22027.       ADD.w   d0,d0 ; Get bit into extend
  22028.       ADDX.b  d4,d4 ; Put bit into chunky byte 1
  22029.       ADD.w   d1,d1
  22030.       ADDX.b  d4,d4
  22031.       ADD.w   d2,d2
  22032.       ADDX.b  d4,d4
  22033.       ADD.w   d3,d3
  22034.       ADDX.b  d4,d4
  22035.  
  22036.       ROL.l   #8,d4 ; Get next byte
  22037.       ADD.w   d0,d0 ; Get bit into extend
  22038.       ADDX.b  d4,d4 ; Put bit into chunky byte 2
  22039.       ADD.w   d1,d1
  22040.       ADDX.b  d4,d4
  22041.       ADD.w   d2,d2
  22042.       ADDX.b  d4,d4
  22043.       ADD.w   d3,d3
  22044.       ADDX.b  d4,d4
  22045.  
  22046.       ROL.l   #8,d4 ; Get next byte
  22047.       ADD.w   d0,d0 ; Get bit into extend
  22048.       ADDX.b  d4,d4 ; Put bit into chunky byte 3
  22049.       ADD.w   d1,d1
  22050.       ADDX.b  d4,d4
  22051.       ADD.w   d2,d2
  22052.       ADDX.b  d4,d4
  22053.       ADD.w   d3,d3
  22054.       ADDX.b  d4,d4
  22055.  
  22056.       ROL.l   #8,d5 ; Second group of bytes in register d5
  22057.       ADD.w   d0,d0 ; Get bit into extend
  22058.       ADDX.b  d5,d5 ; Put bit into chunky byte 4
  22059.       ADD.w   d1,d1
  22060.       ADDX.b  d5,d5
  22061.       ADD.w   d2,d2
  22062.       ADDX.b  d5,d5
  22063.       ADD.w   d3,d3
  22064.       ADDX.b  d5,d5
  22065.  
  22066.       ROL.l   #8,d5 ; Get next byte
  22067.       ADD.w   d0,d0 ; Get bit into extend
  22068.       ADDX.b  d5,d5 ; Put bit into chunky byte 5
  22069.       ADD.w   d1,d1
  22070.       ADDX.b  d5,d5
  22071.       ADD.w   d2,d2
  22072.       ADDX.b  d5,d5
  22073.       ADD.w   d3,d3
  22074.       ADDX.b  d5,d5
  22075.  
  22076.       ROL.l   #8,d5 ; Get next byte
  22077.       ADD.w   d0,d0 ; Get bit into extend
  22078.       ADDX.b  d5,d5 ; Put bit into chunky byte 6
  22079.       ADD.w   d1,d1
  22080.       ADDX.b  d5,d5
  22081.       ADD.w   d2,d2
  22082.       ADDX.b  d5,d5
  22083.       ADD.w   d3,d3
  22084.       ADDX.b  d5,d5
  22085.  
  22086.       ROL.l   #8,d5 ; Get next byte
  22087.       ADD.w   d0,d0 ; Get bit into extend
  22088.       ADDX.b  d5,d5 ; Put bit into chunky byte 7
  22089.       ADD.w   d1,d1
  22090.       ADDX.b  d5,d5
  22091.       ADD.w   d2,d2
  22092.       ADDX.b  d5,d5
  22093.       ADD.w   d3,d3
  22094.       ADDX.b  d5,d5
  22095.  
  22096.       ROL.l   #8,d6 ; Third group of bytes in register d6
  22097.       ADD.w   d0,d0 ; Get bit into extend
  22098.       ADDX.b  d6,d6 ; Put bit into chunky byte 8
  22099.       ADD.w   d1,d1
  22100.       ADDX.b  d6,d6
  22101.       ADD.w   d2,d2
  22102.       ADDX.b  d6,d6
  22103.       ADD.w   d3,d3
  22104.       ADDX.b  d6,d6
  22105.  
  22106.       ROL.l   #8,d6 ; Get next byte
  22107.       ADD.w   d0,d0 ; Get bit into extend
  22108.       ADDX.b  d6,d6 ; Put bit into chunky byte 9
  22109.       ADD.w   d1,d1
  22110.       ADDX.b  d6,d6
  22111.       ADD.w   d2,d2
  22112.       ADDX.b  d6,d6
  22113.       ADD.w   d3,d3
  22114.       ADDX.b  d6,d6
  22115.  
  22116.       ROL.l   #8,d6 ; Get next byte
  22117.       ADD.w   d0,d0 ; Get bit into extend
  22118.       ADDX.b  d6,d6 ; Put bit into chunky byte 10
  22119.       ADD.w   d1,d1
  22120.       ADDX.b  d6,d6
  22121.       ADD.w   d2,d2
  22122.       ADDX.b  d6,d6
  22123.       ADD.w   d3,d3
  22124.       ADDX.b  d6,d6
  22125.  
  22126.       ROL.l   #8,d6 ; Get next byte
  22127.       ADD.w   d0,d0 ; Get bit into extend
  22128.       ADDX.b  d6,d6 ; Put bit into chunky byte 11
  22129.       ADD.w   d1,d1
  22130.       ADDX.b  d6,d6
  22131.       ADD.w   d2,d2
  22132.       ADDX.b  d6,d6
  22133.       ADD.w   d3,d3
  22134.       ADDX.b  d6,d6
  22135.  
  22136.       ROL.l   #8,d7 ; Third group of bytes in register d7
  22137.       ADD.w   d0,d0 ; Get bit into extend
  22138.       ADDX.b  d7,d7 ; Put bit into chunky byte 12
  22139.       ADD.w   d1,d1
  22140.       ADDX.b  d7,d7
  22141.       ADD.w   d2,d2
  22142.       ADDX.b  d7,d7
  22143.       ADD.w   d3,d3
  22144.       ADDX.b  d7,d7
  22145.  
  22146.       ROL.l   #8,d7 ; Get next byte
  22147.       ADD.w   d0,d0 ; Get bit into extend
  22148.       ADDX.b  d7,d7 ; Put bit into chunky byte 13
  22149.       ADD.w   d1,d1
  22150.       ADDX.b  d7,d7
  22151.       ADD.w   d2,d2
  22152.       ADDX.b  d7,d7
  22153.       ADD.w   d3,d3
  22154.       ADDX.b  d7,d7
  22155.  
  22156.       ROL.l   #8,d7 ; Get next byte
  22157.       ADD.w   d0,d0 ; Get bit into extend
  22158.       ADDX.b  d7,d7 ; Put bit into chunky byte 14
  22159.       ADD.w   d1,d1
  22160.       ADDX.b  d7,d7
  22161.       ADD.w   d2,d2
  22162.       ADDX.b  d7,d7
  22163.       ADD.w   d3,d3
  22164.       ADDX.b  d7,d7
  22165.  
  22166.       ROL.l   #8,d7 ; Get next byte
  22167.       ADD.w   d0,d0 ; Get bit into extend
  22168.       ADDX.b  d7,d7 ; Put bit into chunky byte 15
  22169.       ADD.w   d1,d1
  22170.       ADDX.b  d7,d7
  22171.       ADD.w   d2,d2
  22172.       ADDX.b  d7,d7
  22173.       ADD.w   d3,d3
  22174.       ADDX.b  d7,d7
  22175.  
  22176.       MOVE.w  (a1),d0 ; Get bitplane 4 data 16 pixels
  22177.       SUB.l   a3,a1 ; Next bitplane
  22178.       ROL.l   #8,d4 ; First group of bytes in register d4
  22179.       MOVE.w  (a1),d1 ; Get bitplane 5 data 16 pixels
  22180.       SUB.l   a3,a1 ; Next bitplane
  22181.       ADD.w   d0,d0 ; Get bit into extend
  22182.       ADDX.b  d4,d4 ; Put bit into chunky byte 0
  22183.       MOVE.w  (a1),d2 ; Get bitplane 6 data 16 pixels
  22184.       SUB.l   a3,a1 ; Next bitplane
  22185.       ADD.w   d1,d1
  22186.       ADDX.b  d4,d4
  22187.       MOVE.w  (a1),d3 ; Get bitplane 7 data 16 pixels
  22188.       ADD.w   d2,d2
  22189.       ADDX.b  d4,d4
  22190.       SUB.l   a3,a1 ; Next bitplane
  22191.       ADD.w   d3,d3
  22192.       ADDX.b  d4,d4
  22193.  
  22194.       ROL.l   #8,d4 ; Get next byte
  22195.       ADD.w   d0,d0 ; Get bit into extend
  22196.       ADDX.b  d4,d4 ; Put bit into chunky byte 1
  22197.       ADD.w   d1,d1
  22198.       ADDX.b  d4,d4
  22199.       ADD.w   d2,d2
  22200.       ADDX.b  d4,d4
  22201.       ADD.w   d3,d3
  22202.       ADDX.b  d4,d4
  22203.  
  22204.       ROL.l   #8,d4 ; Get next byte
  22205.       ADD.w   d0,d0 ; Get bit into extend
  22206.       ADDX.b  d4,d4 ; Put bit into chunky byte 2
  22207.       ADD.w   d1,d1
  22208.       ADDX.b  d4,d4
  22209.       ADD.w   d2,d2
  22210.       ADDX.b  d4,d4
  22211.       ADD.w   d3,d3
  22212.       ADDX.b  d4,d4
  22213.  
  22214.       ROL.l   #8,d4 ; Get next byte
  22215.       ADD.w   d0,d0 ; Get bit into extend
  22216.       ADDX.b  d4,d4 ; Put bit into chunky byte 3
  22217.       ADD.w   d1,d1
  22218.       ADDX.b  d4,d4
  22219.       ADD.w   d2,d2
  22220.       ADDX.b  d4,d4
  22221.       ADD.w   d3,d3
  22222.       ADDX.b  d4,d4
  22223.  
  22224.       MOVE.l  d4,(a0)+ ; Write chunky longword
  22225.  
  22226.       ROL.l   #8,d5 ; Second group of bytes in register d5
  22227.       ADD.w   d0,d0 ; Get bit into extend
  22228.       ADDX.b  d5,d5 ; Put bit into chunky byte 4
  22229.       ADD.w   d1,d1
  22230.       ADDX.b  d5,d5
  22231.       ADD.w   d2,d2
  22232.       ADDX.b  d5,d5
  22233.       ADD.w   d3,d3
  22234.       ADDX.b  d5,d5
  22235.  
  22236.       ROL.l   #8,d5 ; Get next byte
  22237.       ADD.w   d0,d0 ; Get bit into extend
  22238.       ADDX.b  d5,d5 ; Put bit into chunky byte 5
  22239.       ADD.w   d1,d1
  22240.       ADDX.b  d5,d5
  22241.       ADD.w   d2,d2
  22242.       ADDX.b  d5,d5
  22243.       ADD.w   d3,d3
  22244.       ADDX.b  d5,d5
  22245.  
  22246.       ROL.l   #8,d5 ; Get next byte
  22247.       ADD.w   d0,d0 ; Get bit into extend
  22248.       ADDX.b  d5,d5 ; Put bit into chunky byte 6
  22249.       ADD.w   d1,d1
  22250.       ADDX.b  d5,d5
  22251.       ADD.w   d2,d2
  22252.       ADDX.b  d5,d5
  22253.       ADD.w   d3,d3
  22254.       ADDX.b  d5,d5
  22255.  
  22256.       ROL.l   #8,d5 ; Get next byte
  22257.       ADD.w   d0,d0 ; Get bit into extend
  22258.       ADDX.b  d5,d5 ; Put bit into chunky byte 7
  22259.       ADD.w   d1,d1
  22260.       ADDX.b  d5,d5
  22261.       ADD.w   d2,d2
  22262.       ADDX.b  d5,d5
  22263.       ADD.w   d3,d3
  22264.       ADDX.b  d5,d5
  22265.  
  22266.       MOVE.l  d5,(a0)+ ; Write chunky longword
  22267.  
  22268.       ROL.l   #8,d6 ; Third group of bytes in register d6
  22269.       ADD.w   d0,d0 ; Get bit into extend
  22270.       ADDX.b  d6,d6 ; Put bit into chunky byte 8
  22271.       ADD.w   d1,d1
  22272.       ADDX.b  d6,d6
  22273.       ADD.w   d2,d2
  22274.       ADDX.b  d6,d6
  22275.       ADD.w   d3,d3
  22276.       ADDX.b  d6,d6
  22277.  
  22278.       ROL.l   #8,d6 ; Get next byte
  22279.       ADD.w   d0,d0 ; Get bit into extend
  22280.       ADDX.b  d6,d6 ; Put bit into chunky byte 9
  22281.       ADD.w   d1,d1
  22282.       ADDX.b  d6,d6
  22283.       ADD.w   d2,d2
  22284.       ADDX.b  d6,d6
  22285.       ADD.w   d3,d3
  22286.       ADDX.b  d6,d6
  22287.  
  22288.       ROL.l   #8,d6 ; Get next byte
  22289.       ADD.w   d0,d0 ; Get bit into extend
  22290.       ADDX.b  d6,d6 ; Put bit into chunky byte 10
  22291.       ADD.w   d1,d1
  22292.       ADDX.b  d6,d6
  22293.       ADD.w   d2,d2
  22294.       ADDX.b  d6,d6
  22295.       ADD.w   d3,d3
  22296.       ADDX.b  d6,d6
  22297.  
  22298.       ROL.l   #8,d6 ; Get next byte
  22299.       ADD.w   d0,d0 ; Get bit into extend
  22300.       ADDX.b  d6,d6 ; Put bit into chunky byte 11
  22301.       ADD.w   d1,d1
  22302.       ADDX.b  d6,d6
  22303.       ADD.w   d2,d2
  22304.       ADDX.b  d6,d6
  22305.       ADD.w   d3,d3
  22306.       ADDX.b  d6,d6
  22307.  
  22308.       MOVE.l  d6,(a0)+ ; Write chunky longword
  22309.  
  22310.       ROL.l   #8,d7 ; Third group of bytes in register d7
  22311.       ADD.w   d0,d0 ; Get bit into extend
  22312.       ADDX.b  d7,d7 ; Put bit into chunky byte 12
  22313.       ADD.w   d1,d1
  22314.       ADDX.b  d7,d7
  22315.       ADD.w   d2,d2
  22316.       ADDX.b  d7,d7
  22317.       ADD.w   d3,d3
  22318.       ADDX.b  d7,d7
  22319.  
  22320.       ROL.l   #8,d7 ; Get next byte
  22321.       ADD.w   d0,d0 ; Get bit into extend
  22322.       ADDX.b  d7,d7 ; Put bit into chunky byte 13
  22323.       ADD.w   d1,d1
  22324.       ADDX.b  d7,d7
  22325.       ADD.w   d2,d2
  22326.       ADDX.b  d7,d7
  22327.       ADD.w   d3,d3
  22328.       ADDX.b  d7,d7
  22329.  
  22330.       ROL.l   #8,d7 ; Get next byte
  22331.       ADD.w   d0,d0 ; Get bit into extend
  22332.       ADDX.b  d7,d7 ; Put bit into chunky byte 14
  22333.       ADD.w   d1,d1
  22334.       ADDX.b  d7,d7
  22335.       ADD.w   d2,d2
  22336.       ADDX.b  d7,d7
  22337.       ADD.w   d3,d3
  22338.       ADDX.b  d7,d7
  22339.  
  22340.       ROL.l   #8,d7 ; Get next byte
  22341.       ADD.w   d0,d0 ; Get bit into extend
  22342.       ADDX.b  d7,d7 ; Put bit into chunky byte 15
  22343.       ADD.w   d1,d1
  22344.       ADDX.b  d7,d7
  22345.       ADD.w   d2,d2
  22346.       ADDX.b  d7,d7
  22347.       ADD.w   d3,d3
  22348.       ADDX.b  d7,d7
  22349.  
  22350.       MOVE.l  d7,(a0)+ ; Write chunky longword
  22351.  
  22352.       MOVE.l  a2,a1 ; Restore
  22353.       ADD.w   #2,a1 ; Next word
  22354.  
  22355.       SWAP    d2 ; Restore
  22356.       DBRA    d2,PerfPlanar16ToChunkyXLoop
  22357.     ADD.w   a5,a1 ; Planar linemod
  22358.     ADD.w   a6,a0 ; Chunky linemod
  22359.     MOVE.l  a4,d3 ; Restore
  22360.     SWAP    d3
  22361.     MOVE.w  d3,d2
  22362.     SWAP    d3
  22363.     DBRA    d3,PerfPlanar16ToChunkyYLoop
  22364.   MOVEM.l (a7)+,a3-a6 ; Restore
  22365.   RTS
  22366.  
  22367. PerformReMap
  22368. ;Remap an image from colour0 to colour1 or using a remapping table
  22369. ;a0=Struct of resource
  22370. ;a2=Table address if being used
  22371. ;d2=Bitmap number if using colours, or -1 if using table
  22372. ;d5=Colour0 if being used
  22373. ;d6=Colour1 if being used
  22374. ;Trashes many
  22375.   MOVE.l  CRsrc_Data-ChunkyResources(a0),a1 ; Image data
  22376.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Source wraps?
  22377.   BEQ     PerfReMapNoWrap
  22378.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1
  22379. PerfReMapNoWrap
  22380.   MOVE.w  CRsrc_LineMod-ChunkyResources(a0),d7 ; Source linemod
  22381.   TST.b   CRsrc_Clipping-ChunkyResources(a0) ; Clip?
  22382.   BEQ     PerfReMapNoClip
  22383.   ADD.l   CRsrc_ClipBytes-ChunkyResources(a0),a1
  22384.   ADD.w   CRsrc_ClipLMod-ChunkyResources(a0),d7
  22385.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d0 ; Width
  22386.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d1 ; Height
  22387.   BRA     PerfReMapSkip
  22388. PerfReMapNoClip
  22389.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d0 ; Width
  22390.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d1 ; Height
  22391. PerfReMapSkip
  22392.   LSR.w   #2,d0 ; Width/4 for longwords
  22393.   SUBQ.w  #1,d0 ; XLoopcounter
  22394.   MOVE.w  d0,d4 ; Copy XLoop
  22395.   SUBQ.w  #1,d1 ; YLoopcounter
  22396.   TST.w   d2 ; Multiple remaps using table?
  22397.   BGE     PerfReMapOne
  22398. PerfReMapTable
  22399.   MOVEQ.l #0,d2 ; Init
  22400.   MOVEQ.l #0,d3 ; Init
  22401.   MOVEQ.l #0,d5 ; Init
  22402.   MOVEQ.l #0,d6 ; Init
  22403. PerfReMapTableYLoop
  22404.     MOVE.w  d4,d0 ; Copy XLoop
  22405. PerfReMapTableXLoop
  22406.       MOVE.b  (a1),d2
  22407.       MOVE.b  0(a2,d2.w),(a1)+
  22408.       MOVE.b  (a1),d3
  22409.       MOVE.b  0(a2,d3.w),(a1)+
  22410.       MOVE.b  (a1),d5
  22411.       MOVE.b  0(a2,d5.w),(a1)+
  22412.       MOVE.b  (a1),d6
  22413.       MOVE.b  0(a2,d6.w),(a1)+
  22414.       DBRA    d0,PerfReMapTableXLoop
  22415.     ADD.w   d7,a1 ; Linemod
  22416.     DBRA    d1,PerfReMapTableYLoop
  22417.   RTS;pop
  22418. PerfReMapOne
  22419.   MOVEQ.l #4,d2 ; Skip value
  22420. PerfReMapOneYLoop
  22421.     MOVE.w  d4,d0 ; Copy XLoop
  22422. PerfReMapOneXLoop
  22423.       MOVE.l  (a1),d3 ; Get image
  22424.       SUB.b   d5,d3 ; -Colour0
  22425.       BNE     PerfReMapOneJump1
  22426.       MOVE.b  d6,3(a1)
  22427. PerfReMapOneJump1
  22428.       SWAP    d3
  22429.       SUB.b   d5,d3
  22430.       BNE     PerfReMapOneJump2
  22431.       MOVE.b  d6,1(a1)
  22432. PerfReMapOneJump2
  22433.       LSR.l   #8,d3
  22434.       SUB.b   d5,d3
  22435.       BNE     PerfReMapOneJump3
  22436.       MOVE.b  d6,(a1)
  22437. PerfReMapOneJump3
  22438.       SWAP    d3
  22439.       SUB.b   d5,d3
  22440.       BNE     PerfReMapOneJump4
  22441.       MOVE.b  d6,2(a1)
  22442. PerfReMapOneJump4
  22443.       ADD.w   d2,a1
  22444.       DBRA    d0,PerfReMapOneXLoop
  22445.     ADD.w   d7,a1 ; Linemod
  22446.     DBRA    d1,PerfReMapOneYLoop
  22447.   RTS
  22448.  
  22449. PerformLine
  22450. ;Draws a line in any direction from X1,Y1 to X2,Y2 in the specified colour or ink
  22451. ;d0=X1
  22452. ;d1=Y1
  22453. ;d2=X2
  22454. ;d3=Y2
  22455. ;d4=Colour
  22456. ;a0=Struct
  22457. ;a1=Data address
  22458.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Wraps?
  22459.   BEQ     PerfLineNoWrap ; nope
  22460.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a1 ; Add offset
  22461. PerfLineNoWrap
  22462.   MOVEQ.l #0,d7
  22463.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d7 ; Get total width
  22464.   EXT.l   d2
  22465.   EXT.l   d3
  22466.   MOVE.w  d4,a2 ; Store colour
  22467.   MOVE.w  d0,d5 ; dx=Abs(xa-xb)
  22468.   SUB.w   d2,d5
  22469.   BGE     PerfLineSkip1
  22470.   NEG.w   d5
  22471. PerfLineSkip1
  22472.   MOVE.w  d1,d6 ; dy=Abs(ya-yb)
  22473.   SUB.w   d3,d6
  22474.   BGE     PerfLineSkip2
  22475.   NEG.w   d6
  22476. PerfLineSkip2
  22477.   EXT.l   d5
  22478.   EXT.l   d6
  22479.   MOVE.w  d7,a0 ; Store
  22480.   CMP.w   d5,d6 ; If dx>dy
  22481.   BGE     PerfLineSkip3
  22482.     CMP.w   d0,d2 ; If xa>xb
  22483.     BGE     PerfLineSkip4
  22484.       ;MOVE.l  d0,d0 ; xEnd=xa .. d0=xEnd
  22485.       ;MOVE.l  d2,d2 ; x=xb .. d2=x
  22486.       ;MOVE.l  d3,d3 ; y=yb .. d3=y
  22487.       CMP.w   d1,d3 ; If ya>yb then yadder=1 else yadder=-1
  22488.       BLT   PerfLineSkip8
  22489.         NEG.w   d7
  22490. PerfLineSkip8
  22491.     BRA     PerfLineSkip5 ; Else
  22492. PerfLineSkip4
  22493.       EXG.l   d0,d2 ; xEnd=xb .. d0=xEnd
  22494.       ;MOVE.l  d2,d2 ; x=xa .. d2=x
  22495.       EXG.l   d1,d3 ; y=ya .. d3=y
  22496.       CMP.w   d3,d1 ; If ya>yb then yadder=-1 else yadder=1
  22497.       BGT     PerfLineSkip5
  22498.         NEG.w   d7
  22499. PerfLineSkip5 ; EndIf
  22500.     MOVE.w  d7,d1
  22501.     MOVE.w  d6,d7
  22502.     ADD.l   d7,d7
  22503.     ADD.l   d6,d6 ; 2*dy
  22504.     SUB.l   d5,d7 ; p=(2*dy)-dx
  22505.     ADD.l   d5,d5 ; 2*dx
  22506.     MOVE.l  d6,d4 ; Copy
  22507.     SUB.l   d5,d4 ; 2*(dy-dx) = (2*dy)-(2*dx)
  22508.     MOVE.w  a0,d5 ; Get Total byte width
  22509.     MULU    d3,d5 ; yoffset
  22510.     ADD.l   d2,a1 ; offset to start
  22511.     EXT.l   d1
  22512.     ADD.l   d5,a1 ; Point
  22513.     MOVE.w  a2,d5 ; datareg
  22514.     MOVE.w  _DrawingModeType,d3 ; Get mode
  22515.     CMP.b   #4,d3
  22516.     BLT     PerfLinePlotInv
  22517.     BGT     PerfLinePlotNextMode
  22518. PerfLinePlotColour
  22519.     MOVE.b  d5,(a1)+ ; Plot, and x+1 from the loop below
  22520. PerfLineColourLoop1
  22521.     CMP.l   d2,d0 ; While x<xEnd
  22522.     BLE     PerfLineColourSkip16
  22523.     SUB.l   d2,d0 ; Make value for dbra
  22524.     SUBQ.l  #1,d0 ; loopcounter
  22525. PerfLineColourLoop1a
  22526.       TST.l   d7 ; If P<0?
  22527.       BGE     PerfLineColourSkip17
  22528.         ADD.l d6,d7 ; p=p+(2*dy)
  22529.       MOVE.b  d5,(a1)+ ; Plot
  22530.     DBRA  d0,PerfLineColourLoop1a ; Wend
  22531.   RTS;pop
  22532. PerfLineColourSkip17 ; Else
  22533.         ADD.l   d1,a1 ; y+yadder
  22534.         ADD.l   d4,d7 ; p=p+2*(dy-dx)
  22535. PerfLineColourSkip18 ; EndIf
  22536.       MOVE.b  d5,(a1)+ ; Plot and x+1 on the address
  22537.     DBRA    d0,PerfLineColourLoop1a ; Wend
  22538. PerfLineColourSkip16
  22539.   RTS ; Else .. pop
  22540. PerfLinePlotInv
  22541.     NOT.b   (a1)+ ; Plot Inv and x+1
  22542. PerfLineInvLoop1
  22543.     CMP.l   d2,d0 ; While x<xEnd
  22544.     BLE     PerfLineInvSkip16
  22545.     SUB.l   d2,d0 ; Make value for dbra
  22546.     SUBQ.l  #1,d0 ; loopcounter
  22547. PerfLineInvLoop1a
  22548.       TST.l   d7 ; If P<0?
  22549.       BGE     PerfLineInvSkip17
  22550.         ADD.l d6,d7 ; p=p+(2*dy)
  22551.       NOT.b  (a1)+ ; Plot Inv
  22552.     DBRA  d0,PerfLineInvLoop1a ; Wend
  22553.   RTS;pop
  22554. PerfLineInvSkip17 ; Else
  22555.         ADD.l   d1,a1 ; y+yadder
  22556.         ADD.l   d4,d7 ; p=p+2*(dy-dx)
  22557. PerfLineInvSkip18 ; EndIf
  22558.       NOT.b  (a1)+ ; Plot Inv and x+1 on the address
  22559.     DBRA    d0,PerfLineInvLoop1a ; Wend
  22560. PerfLineInvSkip16
  22561.   RTS ; Else .. pop
  22562. PerfLinePlotNextMode
  22563.     CMP.b   #6,d3
  22564.     BLT     PerfLinePlotReMap
  22565.     BGT     PerfLinePlotAdd
  22566. PerfLinePlotSimpleReMap
  22567.     MOVE.w  CurrentChunkyTable1,d3
  22568.     EXG.l   d3,d0
  22569.     !GetTableObjectPtr ; Base in a0
  22570.     MOVE.l  d3,d0
  22571.     MOVE.l  CTable_LMem-ChunkyTables(a0),a0 ; Base of current table
  22572.     MOVEQ.l #0,d5 ; Init
  22573.     MOVE.b  (a1),d5 ; Get point
  22574.     MOVE.b  0(a0,d5.w),(a1)+ ; Plot SimpleReMap and x+1
  22575. PerfLineSimpleReMapLoop1
  22576.     CMP.l   d2,d0 ; While x<xEnd
  22577.     BLE     PerfLineSimpleReMapSkip16
  22578.     SUB.l   d2,d0 ; Make value for dbra
  22579.     SUBQ.l  #1,d0 ; loopcounter
  22580. PerfLineSimpleReMapLoop1a
  22581.       TST.l   d7 ; If P<0?
  22582.       BGE     PerfLineSimpleReMapSkip17
  22583.         ADD.l d6,d7 ; p=p+(2*dy)
  22584.       MOVE.b  (a1),d5 ; Get point
  22585.       MOVE.b  0(a0,d5.w),(a1)+ ; Plot SimpleReMap
  22586.     DBRA  d0,PerfLineSimpleReMapLoop1a ; Wend
  22587.   RTS;pop
  22588. PerfLineSimpleReMapSkip17 ; Else
  22589.         ADD.l   d1,a1 ; y+yadder
  22590.         ADD.l   d4,d7 ; p=p+2*(dy-dx)
  22591. PerfLineSimpleReMapSkip18 ; EndIf
  22592.       MOVE.b  (a1),d5 ; Get point
  22593.       MOVE.b  0(a0,d5.w),(a1)+ ; Plot SimpleReMap and x+1 on the address
  22594.     DBRA    d0,PerfLineSimpleReMapLoop1a ; Wend
  22595. PerfLineSimpleReMapSkip16
  22596.   RTS ; Else .. pop
  22597. PerfLinePlotReMap
  22598.     MOVE.w  CurrentChunkyTable1,d3
  22599.     EXG.l   d3,d0
  22600.     !GetTableObjectPtr ; Base in a0
  22601.     MOVE.l  d3,d0
  22602.     MOVE.l  CTable_LMem-ChunkyTables(a0),a0 ; Base of current table
  22603.     LSL.w   #8,d5
  22604.     AND.l   #$0000FF00,d5 ;Prepare
  22605.     MOVE.b  (a1),d5 ; Get point
  22606.     MOVE.b  0(a0,d5.l),(a1)+ ; Plot ReMap and x+1
  22607. PerfLineReMapLoop1
  22608.     CMP.l   d2,d0 ; While x<xEnd
  22609.     BLE     PerfLineReMapSkip16
  22610.     SUB.l   d2,d0 ; Make value for dbra
  22611.     SUBQ.l  #1,d0 ; loopcounter
  22612. PerfLineReMapLoop1a
  22613.       TST.l   d7 ; If P<0?
  22614.       BGE     PerfLineReMapSkip17
  22615.         ADD.l d6,d7 ; p=p+(2*dy)
  22616.       MOVE.b  (a1),d5 ; Get point
  22617.       MOVE.b  0(a0,d5.l),(a1)+ ; Plot ReMap
  22618.     DBRA  d0,PerfLineReMapLoop1a ; Wend
  22619.   RTS;pop
  22620. PerfLineReMapSkip17 ; Else
  22621.         ADD.l   d1,a1 ; y+yadder
  22622.         ADD.l   d4,d7 ; p=p+2*(dy-dx)
  22623. PerfLineReMapSkip18 ; EndIf
  22624.       MOVE.b  (a1),d5 ; Get point
  22625.       MOVE.b  0(a0,d5.l),(a1)+ ; Plot ReMap and x+1 on the address
  22626.     DBRA    d0,PerfLineReMapLoop1a ; Wend
  22627. PerfLineReMapSkip16
  22628.   RTS ; Else .. pop
  22629. PerfLinePlotAdd
  22630.     ADD.b   d5,(a1)+ ; Plot Add and x+1
  22631. PerfLineAddLoop1
  22632.     CMP.l   d2,d0 ; While x<xEnd
  22633.     BLE     PerfLineAddSkip16
  22634.     SUB.l   d2,d0 ; Make value for dbra
  22635.     SUBQ.l  #1,d0 ; loopcounter
  22636. PerfLineAddLoop1a
  22637.       TST.l   d7 ; If P<0?
  22638.       BGE     PerfLineAddSkip17
  22639.         ADD.l d6,d7 ; p=p+(2*dy)
  22640.       ADD.b   d5,(a1)+ ; Plot Add
  22641.     DBRA  d0,PerfLineAddLoop1a ; Wend
  22642.   RTS;pop
  22643. PerfLineAddSkip17 ; Else
  22644.         ADD.l   d1,a1 ; y+yadder
  22645.         ADD.l   d4,d7 ; p=p+2*(dy-dx)
  22646. PerfLineAddSkip18 ; EndIf
  22647.       ADD.b   d5,(a1)+ ; Plot Add and x+1 on the address
  22648.     DBRA    d0,PerfLineAddLoop1a ; Wend
  22649. PerfLineAddSkip16
  22650.   RTS ; Else .. pop
  22651. ;**Second set of octants**
  22652. PerfLineSkip3
  22653.     MOVEQ.l #1,d7 ; init xadder
  22654.     CMP.w   d1,d3 ; If ya>yb
  22655.     BGE     PerfLineSkip6
  22656.     ;MOVE.l  d1,d1 ; yEnd=ya .. d1=yEnd
  22657.     ;MOVE.l  d3,d3 ; y=yb .. d3=y
  22658.     ;MOVE.l  d2,d2 ; x=xb .. d2=x
  22659.     CMP.w   d2,d0 ; If xa>xb then xadder=-1 else xadder=1
  22660.     BGT     PerfLineSkip12
  22661.       NEG.l   d7
  22662. PerfLineSkip12
  22663.     BRA     PerfLineSkip7 ; Else
  22664. PerfLineSkip6
  22665.     EXG.l   d1,d3 ; yEnd=yb .. d1=yEnd
  22666.     ;MOVE.l  d3,d3 ; y=ya .. d3=y
  22667.     EXG.l   d0,d2 ; x=xa .. d2=x
  22668.     CMP.w   d0,d2 ; If xa>xb then xadder=1 else xadder=-1
  22669.     BLE     PerfLineSkip7
  22670.       NEG.l   d7
  22671. PerfLineSkip7 ; EndIf
  22672.     MOVE.w  d5,d0
  22673.     ADD.l   d0,d0
  22674.     ADD.l   d5,d5 ; 2*dx
  22675.     SUB.l   d6,d0 ; p=(2*dx)-dy
  22676.     ADD.l   d6,d6 ; 2*dy
  22677.     MOVE.l  d5,d4 ; Copy
  22678.     SUB.l   d6,d4 ; 2*(dx-dy) = (2*dx)-(2*dy)
  22679.     MOVE.w  a0,d6 ; Get Total byte width for y movement
  22680.     MULU    d3,d6 ; yoffset
  22681.     ADD.l   d2,a1 ; offset to start
  22682.     EXT.l   d7
  22683.     MOVE.l  a0,d2 ; datareg
  22684.     ADD.l   d6,a1 ; Point
  22685.     MOVE.w  _DrawingModeType,d6 ; Get mode
  22686.     CMP.b   #4,d6 ; What mode?
  22687.     BLT     PerfLinePlotInv2
  22688.     BGT     PerfLineNextMode3
  22689. PerfLinePlotColour2
  22690.     MOVE.w  a2,d6 ; datareg
  22691.     MOVE.b  d6,(a1) ; Plot
  22692. PerfLineColourLoop2
  22693.     CMP.l   d3,d1 ; While y<yEnd
  22694.     BLE     PerfLineColourSkip19
  22695.     SUB.l   d3,d1 ; Make value for dbra
  22696.     SUBQ.l  #1,d1 ; loopcounter
  22697. PerfLineColourLoop2a
  22698.       ADD.l  d2,a1
  22699.       TST.l   d0 ; If p<0
  22700.       BGE     PerfLineColourSkip20
  22701.         ADD.l d5,d0 ; p=p+(2*dx)
  22702.       MOVE.b  d6,(a1) ; Plot
  22703.     DBRA    d1,PerfLineColourLoop2a ; Wend
  22704.   RTS;pop
  22705. PerfLineColourSkip20
  22706.         ADD.l   d7,a1 ; x+xadder
  22707.         ADD.l   d4,d0 ; p=p+2*(dx-dy)
  22708. PerfLineColourSkip21 ; EndIf
  22709.       MOVE.b  d6,(a1) ; Plot
  22710.     DBRA    d1,PerfLineColourLoop2a ; Wend
  22711. PerfLineColourSkip19
  22712.   RTS ; EndIf
  22713. PerfLinePlotInv2
  22714.     NOT.b   (a1) ; Plot Inv
  22715. PerfLineInvLoop2
  22716.     CMP.l   d3,d1 ; While y<yEnd
  22717.     BLE     PerfLineInvSkip19
  22718.     SUB.l   d3,d1 ; Make value for dbra
  22719.     SUBQ.l  #1,d1 ; loopcounter
  22720. PerfLineInvLoop2a
  22721.       ADD.l  d2,a1
  22722.       TST.l   d0 ; If p<0
  22723.       BGE     PerfLineInvSkip20
  22724.         ADD.l d5,d0 ; p=p+(2*dx)
  22725.       NOT.b   (a1) ; Plot Inv
  22726.     DBRA    d1,PerfLineInvLoop2a ; Wend
  22727.   RTS;pop
  22728. PerfLineInvSkip20
  22729.         ADD.l   d7,a1 ; x+xadder
  22730.         ADD.l   d4,d0 ; p=p+2*(dx-dy)
  22731. PerfLineInvSkip21 ; EndIf
  22732.       NOT.b   (a1) ; Plot Inv
  22733.     DBRA    d1,PerfLineInvLoop2a ; Wend
  22734. PerfLineInvSkip19
  22735.   RTS ; EndIf
  22736. PerfLineNextMode3
  22737.     CMP.b   #6,d6 ; What mode?
  22738.     BLT     PerfLinePlotReMap2
  22739.     BGT     PerfLinePlotAdd2
  22740. PerfLinePlotSimpleReMap2
  22741.     MOVE.w  CurrentChunkyTable1,d6
  22742.     EXG.l   d6,d0
  22743.     !GetTableObjectPtr ; Base in a0
  22744.     MOVE.l  d6,d0
  22745.     MOVE.l  CTable_LMem-ChunkyTables(a0),a0 ; Base of current table
  22746.     MOVEQ.l #0,d6 ; Init
  22747.     MOVE.b  (a1),d6 ; Get point
  22748.     MOVE.b  0(a0,d6.w),(a1) ; Plot SimpleReMap
  22749. PerfLineSimpleReMapLoop2
  22750.     CMP.l   d3,d1 ; While y<yEnd
  22751.     BLE     PerfLineSimpleReMapSkip19
  22752.     SUB.l   d3,d1 ; Make value for dbra
  22753.     SUBQ.l  #1,d1 ; loopcounter
  22754. PerfLineSimpleReMapLoop2a
  22755.       ADD.l  d2,a1
  22756.       TST.l   d0 ; If p<0
  22757.       BGE     PerfLineSimpleReMapSkip20
  22758.         ADD.l d5,d0 ; p=p+(2*dx)
  22759.       MOVE.b  (a1),d6 ; Get point
  22760.       MOVE.b  0(a0,d6.w),(a1) ; Plot SimpleReMap
  22761.     DBRA    d1,PerfLineSimpleReMapLoop2a ; Wend
  22762.   RTS;pop
  22763. PerfLineSimpleReMapSkip20
  22764.         ADD.l   d7,a1 ; x+xadder
  22765.         ADD.l   d4,d0 ; p=p+2*(dx-dy)
  22766. PerfLineSimpleReMapSkip21 ; EndIf
  22767.       MOVE.b  (a1),d6 ; Get point
  22768.       MOVE.b  0(a0,d6.w),(a1) ; Plot SimpleReMap
  22769.     DBRA    d1,PerfLineSimpleReMapLoop2a ; Wend
  22770. PerfLineSimpleReMapSkip19
  22771.   RTS ; EndIf
  22772. PerfLinePlotReMap2
  22773.     MOVE.w  CurrentChunkyTable1,d6
  22774.     EXG.l   d6,d0
  22775.     !GetTableObjectPtr ; Base in a0
  22776.     MOVE.l  d6,d0
  22777.     MOVE.l  CTable_LMem-ChunkyTables(a0),a0 ; Base of current table
  22778.     MOVE.w  a2,d6
  22779.     LSL.w   #8,d6
  22780.     AND.l   #$0000FF00,d6 ; Prepare
  22781.     MOVE.b  (a1),d6 ; Get point
  22782.     MOVE.b  0(a0,d6.l),(a1) ; Plot SimpleReMap
  22783. PerfLineReMapLoop2
  22784.     CMP.l   d3,d1 ; While y<yEnd
  22785.     BLE     PerfLineReMapSkip19
  22786.     SUB.l   d3,d1 ; Make value for dbra
  22787.     SUBQ.l  #1,d1 ; loopcounter
  22788. PerfLineReMapLoop2a
  22789.       ADD.l  d2,a1
  22790.       TST.l   d0 ; If p<0
  22791.       BGE     PerfLineReMapSkip20
  22792.         ADD.l d5,d0 ; p=p+(2*dx)
  22793.       MOVE.b  (a1),d6 ; Get point
  22794.       MOVE.b  0(a0,d6.l),(a1) ; Plot ReMap
  22795.     DBRA    d1,PerfLineReMapLoop2a ; Wend
  22796.   RTS;pop
  22797. PerfLineReMapSkip20
  22798.         ADD.l   d7,a1 ; x+xadder
  22799.         ADD.l   d4,d0 ; p=p+2*(dx-dy)
  22800. PerfLineReMapSkip21 ; EndIf
  22801.       MOVE.b  (a1),d6 ; Get point
  22802.       MOVE.b  0(a0,d6.l),(a1) ; Plot ReMap
  22803.     DBRA    d1,PerfLineReMapLoop2a ; Wend
  22804. PerfLineReMapSkip19
  22805.   RTS ; EndIf
  22806. PerfLinePlotAdd2
  22807.     MOVE.w  a2,d6
  22808.     ADD.b   d6,(a1) ; Plot Add
  22809. PerfLineAddLoop2
  22810.     CMP.l   d3,d1 ; While y<yEnd
  22811.     BLE     PerfLineAddSkip19
  22812.     SUB.l   d3,d1 ; Make value for dbra
  22813.     SUBQ.l  #1,d1 ; loopcounter
  22814. PerfLineAddLoop2a
  22815.       ADD.l  d2,a1
  22816.       TST.l   d0 ; If p<0
  22817.       BGE     PerfLineAddSkip20
  22818.         ADD.l d5,d0 ; p=p+(2*dx)
  22819.       ADD.b   d6,(a1) ; Plot Add
  22820.     DBRA    d1,PerfLineAddLoop2a ; Wend
  22821.   RTS;pop
  22822. PerfLineAddSkip20
  22823.         ADD.l   d7,a1 ; x+xadder
  22824.         ADD.l   d4,d0 ; p=p+2*(dx-dy)
  22825. PerfLineAddSkip21 ; EndIf
  22826.       ADD.b   d6,(a1) ; Plot Add
  22827.     DBRA    d1,PerfLineAddLoop2a ; Wend
  22828. PerfLineAddSkip19
  22829.   RTS ; EndIf
  22830.  
  22831. PerformZoom
  22832. ;Zoom an area from source to destination resources
  22833. ;a0=Source struct
  22834. ;a1=Dest struct
  22835. ;a3=Source data address
  22836. ;a4=Dest data address
  22837. ;a5=SrcX.q
  22838. ;a6=SrcY.q
  22839. ;d2=XAdd.q
  22840. ;d3=YAdd.q
  22841. ;d4=DestX.w
  22842. ;d5=DestY.w
  22843. ;-2(a2)=OpWidth.w
  22844. ;-4(a2)=OpHeight.w
  22845. ;-6(a2)=DeRes?.w
  22846. ;Trashes many
  22847.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Source wraps?
  22848.   BEQ     PerfZoomNoSourceWrap
  22849.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a3 ; add wrap
  22850. PerfZoomNoSourceWrap
  22851.   TST.b   CRsrc_Wrapping-ChunkyResources(a1) ; Dest wraps?
  22852.   BEQ     PerfZoomNoDestWrap
  22853.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a4 ; add wrap
  22854. PerfZoomNoDestWrap
  22855.   MOVE.w  CRsrc_Width-ChunkyResources(a1),d7 ; Get dest width
  22856.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d6 ; Source row bytes
  22857.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a1),d1 ; Get dest totwidth
  22858.   SUB.w   -2(a2),d7 ; subtract OpWidth for extra modulo
  22859.   MULU    d5,d1 ; Y offset
  22860.   ADD.w   d4,a4 ; X in dest
  22861.   ADD.w   CRsrc_LineMod-ChunkyResources(a1),d7 ; Total dest modulo
  22862.   MOVE.w  -4(a2),d0 ; Get OpHeight
  22863.   ADD.l   d1,a4 ; XY in dest
  22864.   SUBQ.w  #1,d0 ; Y dest loopcounter
  22865.   MOVE.w  -2(a2),d4 ; OpWidth
  22866.   MOVE.l  d2,d5 ; d5=XAdd.q
  22867.   TST.w   d5 ; Is XAdd.q the same as XAdd.w?
  22868.   BEQ     PerfZoomY ; If yes we can do an integer X loop (which is faster than integer Y loop, hense comes first)
  22869.   TST.w   -6(a2) ; DeRes?
  22870.   BNE     PerfZoomJump
  22871.   TST.w   d3 ; Is YAdd.q the same as YAdd.w?
  22872.   BEQ     PerfZoomX ; If yes we can do an integer Y loop
  22873. PerfZoomJump
  22874.   ;Otherwise do non-integer X and Y loops
  22875.   MOVE.w  d4,d2 ; Copy OpWidth
  22876.   AND.b   #$03,d2 ; Multiple of 4?
  22877.   BEQ     PerfZoom4
  22878.   SUBQ.w  #1,d4 ; OpWidth-1 for loopcounter
  22879.   MOVE.l  a5,d1 ; Get SrcX.q
  22880.   SWAP    d5 ; Prepare XAdd.q
  22881.   SWAP    d1 ; Prepare SrcX.q
  22882.   MOVE.l  d1,a5 ; Store swapped SrcX.q
  22883.   TST.w   -6(a2) ; DeRes?
  22884.   BNE     PerfZoomDeRes
  22885.   MOVE.w  d4,a2 ; Store OpWidth-1
  22886. PerfZoomYLoop
  22887.     MOVE.l  a6,d1 ; Get SrcY.q
  22888.     SWAP    d1 ; Get SrcY.w
  22889.     MULU    d6,d1 ; Find Y in source
  22890.     MOVE.l  a3,a0 ; Get Source basePtr
  22891.     MOVE.w  d4,d2 ; Get XLoopcounter
  22892.     ADD.l   d1,a0 ; Point to start of source line
  22893.     MOVE.l  d5,d2 ; Get XAdd.q swapped
  22894.     MOVE.l  a5,d1 ; Get SrcX.q swapped
  22895.     CLR.w   d2 ; Wipe integer part
  22896.     MOVE.w  a2,d4 ; Get OpWidth-1
  22897.     ADD.l   d2,d1 ; Prepare extend flag (last thing done before the loop!)
  22898. PerfZoomXLoop
  22899.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 1
  22900.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  22901.       DBRA    d4,PerfZoomXLoop
  22902.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  22903.     ADD.w   d7,a4 ; Dest modulo
  22904.     DBRA    d0,PerfZoomYLoop
  22905.   RTS
  22906. PerfZoomDeRes
  22907.   MOVE.w  d4,a2 ; Store OpWidth-1
  22908.   MOVE.l  a6,d1; Get SrcY.q
  22909.   SWAP    d1 ; Get SrcY.w
  22910.   MOVE.w  d1,d4 ; Store previous integer Y line
  22911.   MULU    d6,d1 ; Find integer Y top
  22912.   MOVE.l  #0,a1 ; Init source integer Y
  22913.   ADD.l   d1,a3 ; Add to base
  22914. PerfZoomDeResYLoop
  22915.     MOVE.l  a3,a0 ; Get Source basePtr
  22916.     MOVE.l  d5,d2 ; Get XAdd.q swapped
  22917.     MOVE.l  a5,d1 ; Get SrcX.q swapped
  22918.     SWAP    d0 ; Store YLoop counter
  22919.     CLR.w   d2 ; Wipe integer part
  22920.     MOVE.w  a2,d0 ; Get OpWidth-1
  22921.     ADD.l   d2,d1 ; Prepare extend flag (last thing done before the loop!)
  22922.     MOVE.b  (a0)+,d2 ; Get first byte
  22923. PerfZoomDeResXLoop
  22924.       MOVE.b  d2,(a4)+ ; DeRes pixel 1
  22925.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  22926.       BCS     PerfZoomDeResSkipX
  22927.       ADD.l   #1,a0 ; Scan source
  22928.       DBRA    d0,PerfZoomDeResXLoop
  22929.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  22930.     MOVE.l  a6,d2 ; Get SrcY.q
  22931.     SWAP    d2 ; Get integer part
  22932.     SWAP    d0 ; Restore YLoop counter
  22933.     MOVE.w  d2,d1 ; temp store
  22934.     ADD.w   #1,a1 ; Y integer counter
  22935.     CMP.w   d4,d2 ; Y integer change?
  22936.     BNE     PerfZoomDeResSkipY
  22937.     MOVE.w  d2,d4 ; Current -> Previous
  22938.     ADD.w   d7,a4 ; Dest modulo
  22939.     DBRA    d0,PerfZoomDeResYLoop
  22940.   RTS
  22941. PerfZoomDeResSkipX
  22942.       MOVE.b  (a0)+,d2 ; Get new byte
  22943.       MOVE.w  d1,d4 ; Current -> Previous
  22944.       DBRA    d0,PerfZoomDeResXLoop
  22945.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  22946.     MOVE.l  a6,d2 ; Get SrcY.q
  22947.     SWAP    d4 ; Restore previous SrcY.w
  22948.     SWAP    d2 ; Get integer part
  22949.     SWAP    d0 ; Restore YLoop counter
  22950.     ADD.w   #1,a1 ; Y integer counter
  22951.     CMP.w   d4,d2 ; Y integer change?
  22952.     BNE     PerfZoomDeResSkipY
  22953.     MOVE.w  d2,d4 ; Current -> Previous
  22954.     ADD.w   d7,a4 ; Dest modulo
  22955.     DBRA    d0,PerfZoomDeResYLoop
  22956.   RTS
  22957. PerfZoomDeResSkipY
  22958.     MOVE.w  d2,d4 ; Current -> Previous
  22959.     MOVE.w  a1,d2 ; Get Y integer amount
  22960.     MULU    d6,d2 ; Find Y integer offset
  22961.     MOVE.w  #0,a1 ; Init
  22962.     ADD.l   d2,a3 ; New base
  22963.     ADD.w   d7,a4 ; Dest modulo
  22964.     DBRA    d0,PerfZoomDeResYLoop
  22965.   RTS
  22966. PerfZoom4
  22967.   LSR.w   #2,d4 ; OpWidth/4 for groups of 4
  22968.   TST.w   -6(a2) ; DeRes?
  22969.   BNE     PerfZoom4Jump
  22970.   MOVE.w  d4,d2 ; Copy OpWidth
  22971.   AND.b   #$03,d2 ; Multiple of 16?
  22972.   BEQ     PerfZoom16
  22973. PerfZoom4Jump
  22974.   SUBQ.w  #1,d4 ; OpWidth-1 for loopcounter
  22975.   MOVE.l  a5,d1 ; Get SrcX.q
  22976.   SWAP    d5 ; Prepare XAdd.q
  22977.   SWAP    d1 ; Prepare SrcX.q
  22978.   MOVE.l  d1,a5 ; Store swapped SrcX.q
  22979.   TST.w   -6(a2) ; DeRes?
  22980.   BNE     PerfZoomDeRes4
  22981.   MOVE.w  d4,a2 ; Store OpWidth-1
  22982. PerfZoom4YLoop
  22983.     MOVE.l  a6,d1 ; Get SrcY.q
  22984.     SWAP    d1 ; Get SrcY.w
  22985.     MULU    d6,d1 ; Find Y in source
  22986.     MOVE.l  a3,a0 ; Get Source basePtr
  22987.     MOVE.w  d4,d2 ; Get XLoopcounter
  22988.     ADD.l   d1,a0 ; Point to start of source line
  22989.     MOVE.l  d5,d2 ; Get XAdd.q swapped
  22990.     MOVE.l  a5,d1 ; Get SrcX.q swapped
  22991.     CLR.w   d2 ; Wipe integer part
  22992.     MOVE.w  a2,d4 ; Get OpWidth-1
  22993.     ADD.l   d2,d1 ; Prepare extend flag (last thing done before the loop!)
  22994. PerfZoom4XLoop
  22995.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 1
  22996.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  22997.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 2
  22998.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  22999.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 3
  23000.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23001.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 4
  23002.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23003.       DBRA    d4,PerfZoom4XLoop
  23004.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  23005.     ADD.w   d7,a4 ; Dest modulo
  23006.     DBRA    d0,PerfZoom4YLoop
  23007.   RTS
  23008. PerfZoomDeRes4
  23009.   MOVE.w  d4,a2 ; Store OpWidth-1
  23010.   MOVE.l  a6,d1; Get SrcY.q
  23011.   SWAP    d1 ; Get SrcY.w
  23012.   MOVE.w  d1,d4 ; Store previous integer Y line
  23013.   MULU    d6,d1 ; Find integer Y top
  23014.   MOVE.l  #0,a1 ; Init source integer Y
  23015.   ADD.l   d1,a3 ; Add to base
  23016. PerfZoomDeRes4YLoop
  23017.     MOVE.l  a3,a0 ; Get Source basePtr
  23018.     MOVE.l  d5,d2 ; Get XAdd.q swapped
  23019.     MOVE.l  a5,d1 ; Get SrcX.q swapped
  23020.     SWAP    d0 ; Store YLoop counter
  23021.     CLR.w   d2 ; Wipe integer part
  23022.     MOVE.w  a2,d0 ; Get OpWidth-1
  23023.     ADD.l   d2,d1 ; Prepare extend flag (last thing done before the loop!)
  23024.     MOVE.b  (a0)+,d2 ; Get first byte
  23025. PerfZoomDeRes4XLoop
  23026.       MOVE.b  d2,(a4)+ ; DeRes pixel 1
  23027.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23028.       BCS     PerfZoomDeRes4SkipX1
  23029.       MOVE.b  d2,(a4)+ ; DeRes pixel 2
  23030.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23031.       BCS     PerfZoomDeRes4SkipX2
  23032.       MOVE.b  d2,(a4)+ ; DeRes pixel 3
  23033.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23034.       BCS     PerfZoomDeRes4SkipX3
  23035.       MOVE.b  d2,(a4)+ ; DeRes pixel 4
  23036.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23037.       BCS     PerfZoomDeRes4SkipX4
  23038.       ADD.l   #4,a0 ; Scan source
  23039.       DBRA    d0,PerfZoomDeRes4XLoop
  23040.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  23041.     MOVE.l  a6,d2 ; Get SrcY.q
  23042.     SWAP    d2 ; Get integer part
  23043.     SWAP    d0 ; Restore YLoop counter
  23044.     MOVE.w  d2,d1 ; temp store
  23045.     ADD.l   #1,a1 ; Y integer counter
  23046.     CMP.w   d4,d2 ; Y integer change?
  23047.     BNE     PerfZoomDeRes4SkipY
  23048.     MOVE.w  d2,d4 ; Current -> Previous
  23049.     ADD.w   d7,a4 ; Dest modulo
  23050.     DBRA    d0,PerfZoomDeRes4YLoop
  23051.   RTS
  23052. PerfZoomDeRes4SkipX1
  23053.       MOVE.b  (a0),d2 ; Get new byte
  23054.       MOVE.b  d2,(a4)+ ; DeRes pixel 2
  23055.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23056.       BCS     PerfZoomDeRes4SkipX2
  23057.       MOVE.b  d2,(a4)+ ; DeRes pixel 3
  23058.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23059.       BCS     PerfZoomDeRes4SkipX3
  23060.       MOVE.b  d2,(a4)+ ; DeRes pixel 4
  23061.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23062.       BCS     PerfZoomDeRes4SkipX4
  23063.       ADD.l   #4,a0 ; Scan source
  23064.       DBRA    d0,PerfZoomDeRes4XLoop
  23065.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  23066.     MOVE.l  a6,d2 ; Get SrcY.q
  23067.     SWAP    d2 ; Get integer part
  23068.     SWAP    d0 ; Restore YLoop counter
  23069.     ADD.l   #1,a1 ; Y integer counter
  23070.     CMP.w   d4,d2 ; Y integer change?
  23071.     BNE     PerfZoomDeRes4SkipY
  23072.     MOVE.w  d2,d4 ; Current -> Previous
  23073.     ADD.w   d7,a4 ; Dest modulo
  23074.     DBRA    d0,PerfZoomDeRes4YLoop
  23075.   RTS
  23076. PerfZoomDeRes4SkipX2
  23077.       MOVE.b  1(a0),d2 ; Get new byte
  23078.       MOVE.b  d2,(a4)+ ; DeRes pixel 3
  23079.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23080.       BCS     PerfZoomDeRes4SkipX3
  23081.       MOVE.b  d2,(a4)+ ; DeRes pixel 4
  23082.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23083.       BCS     PerfZoomDeRes4SkipX4
  23084.       ADD.l   #4,a0 ; Scan source
  23085.       DBRA    d0,PerfZoomDeRes4XLoop
  23086.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  23087.     MOVE.l  a6,d2 ; Get SrcY.q
  23088.     SWAP    d2 ; Get integer part
  23089.     SWAP    d0 ; Restore YLoop counter
  23090.     ADD.l   #1,a1 ; Y integer counter
  23091.     CMP.w   d4,d2 ; Y integer change?
  23092.     BNE     PerfZoomDeRes4SkipY
  23093.     MOVE.w  d2,d4 ; Current -> Previous
  23094.     ADD.w   d7,a4 ; Dest modulo
  23095.     DBRA    d0,PerfZoomDeRes4YLoop
  23096.   RTS
  23097. PerfZoomDeRes4SkipX3
  23098.       MOVE.b  2(a0),d2 ; Get new byte
  23099.       MOVE.b  d2,(a4)+ ; DeRes pixel 4
  23100.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23101.       BCS     PerfZoomDeRes4SkipX4
  23102.       ADD.l   #4,a0 ; Scan source
  23103.       DBRA    d0,PerfZoomDeRes4XLoop
  23104.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  23105.     MOVE.l  a6,d2 ; Get SrcY.q
  23106.     SWAP    d2 ; Get integer part
  23107.     SWAP    d0 ; Restore YLoop counter
  23108.     ADD.l   #1,a1 ; Y integer counter
  23109.     CMP.w   d4,d2 ; Y integer change?
  23110.     BNE     PerfZoomDeRes4SkipY
  23111.     MOVE.w  d2,d4 ; Current -> Previous
  23112.     ADD.w   d7,a4 ; Dest modulo
  23113.     DBRA    d0,PerfZoomDeRes4YLoop
  23114.   RTS
  23115. PerfZoomDeRes4SkipX4
  23116.       MOVE.b  3(a0),d2 ; Get new byte
  23117.       ADD.l   #4,a0 ; Scan source
  23118.       DBRA    d0,PerfZoomDeRes4XLoop
  23119.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  23120.     MOVE.l  a6,d2 ; Get SrcY.q
  23121.     SWAP    d2 ; Get integer part
  23122.     SWAP    d0 ; Restore YLoop counter
  23123.     ADD.l   #1,a1 ; Y integer counter
  23124.     CMP.w   d4,d2 ; Y integer change?
  23125.     BNE     PerfZoomDeRes4SkipY
  23126.     MOVE.w  d2,d4 ; Current -> Previous
  23127.     ADD.w   d7,a4 ; Dest modulo
  23128.     DBRA    d0,PerfZoomDeRes4YLoop
  23129.   RTS
  23130. PerfZoomDeRes4SkipY
  23131.     MOVE.w  d2,d4 ; Current -> Previous
  23132.     MOVE.w  a1,d2 ; Get Y integer amount
  23133.     MULU    d6,d2 ; Find Y integer offset
  23134.     MOVE.l  #0,a1 ; Init
  23135.     ADD.l   d2,a3 ; New base
  23136.     ADD.w   d7,a4 ; Dest modulo
  23137.     DBRA    d0,PerfZoomDeRes4YLoop
  23138.   RTS
  23139. PerfZoom16
  23140.   LSR.w   #2,d4 ; OpWidth/4 (previously /4) for groups of 16
  23141.   SUBQ.w  #1,d4 ; OpWidth-1 for loopcounter
  23142.   MOVE.l  a5,d1 ; Get SrcX.q
  23143.   SWAP    d5 ; Prepare XAdd.q
  23144.   SWAP    d1 ; Prepare SrcX.q
  23145.   MOVE.l  d1,a5 ; Store swapped SrcX.q
  23146.   MOVE.w  d4,a2 ; Store OpWidth-1
  23147. PerfZoom16YLoop
  23148.     MOVE.l  a6,d1 ; Get SrcY.q
  23149.     SWAP    d1 ; Get SrcY.w
  23150.     MULU    d6,d1 ; Find Y in source
  23151.     MOVE.l  a3,a0 ; Get Source basePtr
  23152.     MOVE.w  d4,d2 ; Get XLoopcounter
  23153.     ADD.l   d1,a0 ; Point to start of source line
  23154.     MOVE.l  d5,d2 ; Get XAdd.q swapped
  23155.     MOVE.l  a5,d1 ; Get SrcX.q swapped
  23156.     CLR.w   d2 ; Wipe integer part
  23157.     MOVE.w  a2,d4 ; Get OpWidth-1
  23158.     ADD.l   d2,d1 ; Prepare extend flag (last thing done before the loop!)
  23159. PerfZoom16XLoop
  23160.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 1
  23161.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23162.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 2
  23163.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23164.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 3
  23165.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23166.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 4
  23167.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23168.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 5
  23169.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23170.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 6
  23171.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23172.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 7
  23173.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23174.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 8
  23175.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23176.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 9
  23177.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23178.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 10
  23179.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23180.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 11
  23181.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23182.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 12
  23183.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23184.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 13
  23185.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23186.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 14
  23187.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23188.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 15
  23189.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23190.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 16
  23191.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23192.       DBRA    d4,PerfZoom16XLoop
  23193.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  23194.     ADD.w   d7,a4 ; Dest modulo
  23195.     DBRA    d0,PerfZoom16YLoop
  23196.   RTS
  23197. PerfZoomX ; Y zoom-adder is integer
  23198.   MOVE.l  a6,d1 ; Get SrcY.q
  23199.   SWAP    d1 ; Get SrcY.w
  23200.   MULU    d6,d1 ; Find Y in source
  23201.   SWAP    d3 ; Get YAdd.w
  23202.   MOVE.w  d4,d2 ; Copy OpWidth
  23203.   ADD.l   d1,a3 ; Point
  23204.   MULU    d3,d6 ; YAdd.w*BytesPerLine
  23205.   AND.b   #$03,d2 ; Multiple of 4?
  23206.   BEQ     PerfZoomX4
  23207.   SUBQ.w  #1,d4 ; OpWidth-1 for loopcounter
  23208.   MOVE.l  a5,d1 ; Get SrcX.q
  23209.   SWAP    d5 ; Prepare XAdd.q
  23210.   SWAP    d1 ; Prepare SrcX.q
  23211.   MOVE.w  d4,a2 ; Store OpWidth-1
  23212.   MOVE.l  d1,a5 ; Store swapped SrcX.q
  23213. PerfZoomXYLoop
  23214.     MOVE.l  d5,d2 ; Get XAdd.q swapped
  23215.     MOVE.l  a5,d1 ; Get SrcX.q swapped
  23216.     CLR.w   d2 ; Wipe integer part
  23217.     MOVE.w  a2,d4 ; Get OpWidth-1
  23218.     ADD.l   d2,d1 ; Prepare extend flag (last thing done before the loop!)
  23219. PerfZoomXXLoop
  23220.       MOVE.b  0(a3,d1.w),(a4)+ ; Zoom pixel 1
  23221.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23222.       DBRA    d4,PerfZoomXXLoop
  23223.     ADD.l   d6,a3 ; Source modulo
  23224.     ADD.w   d7,a4 ; Dest modulo
  23225.     DBRA    d0,PerfZoomXYLoop
  23226.   RTS
  23227. PerfZoomX4
  23228.   LSR.w   #2,d4 ; OpWidth/4 for groups of 4
  23229.   MOVE.w  d4,d2 ; Copy OpWidth
  23230.   AND.b   #$03,d2 ; Multiple of 16?
  23231.   BEQ     PerfZoomX16
  23232.   SUBQ.w  #1,d4 ; OpWidth-1 for loopcounter
  23233.   MOVE.l  a5,d1 ; Get SrcX.q
  23234.   SWAP    d5 ; Prepare XAdd.q
  23235.   SWAP    d1 ; Prepare SrcX.q
  23236.   MOVE.w  d4,a2 ; Store OpWidth-1
  23237.   MOVE.l  d1,a5 ; Store swapped SrcX.q
  23238. PerfZoomX4YLoop
  23239.     MOVE.l  d5,d2 ; Get XAdd.q swapped
  23240.     MOVE.l  a5,d1 ; Get SrcX.q swapped
  23241.     CLR.w   d2 ; Wipe integer part
  23242.     MOVE.w  a2,d4 ; Get OpWidth-1
  23243.     ADD.l   d2,d1 ; Prepare extend flag (last thing done before the loop!)
  23244. PerfZoomX4XLoop
  23245.       MOVE.b  0(a3,d1.w),(a4)+ ; Zoom pixel 1
  23246.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23247.       MOVE.b  0(a3,d1.w),(a4)+ ; Zoom pixel 2
  23248.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23249.       MOVE.b  0(a3,d1.w),(a4)+ ; Zoom pixel 3
  23250.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23251.       MOVE.b  0(a3,d1.w),(a4)+ ; Zoom pixel 4
  23252.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23253.       DBRA    d4,PerfZoomX4XLoop
  23254.     ADD.l   d6,a3 ; Source modulo
  23255.     ADD.w   d7,a4 ; Dest modulo
  23256.     DBRA    d0,PerfZoomX4YLoop
  23257.   RTS
  23258. PerfZoomX16
  23259.   LSR.w   #2,d4 ; OpWidth/4 (previously /4) for groups of 16
  23260.   SUBQ.w  #1,d4 ; OpWidth-1 for loopcounter
  23261.   MOVE.l  a5,d1 ; Get SrcX.q
  23262.   SWAP    d5 ; Prepare XAdd.q
  23263.   SWAP    d1 ; Prepare SrcX.q
  23264.   MOVE.w  d4,a2 ; Store OpWidth-1
  23265.   MOVE.l  d1,a5 ; Store swapped SrcX.q
  23266. PerfZoomX16YLoop
  23267.     MOVE.l  d5,d2 ; Get XAdd.q swapped
  23268.     MOVE.l  a5,d1 ; Get SrcX.q swapped
  23269.     CLR.w   d2 ; Wipe integer part
  23270.     MOVE.w  a2,d4 ; Get OpWidth-1
  23271.     ADD.l   d2,d1 ; Prepare extend flag (last thing done before the loop!)
  23272. PerfZoomX16XLoop
  23273.       MOVE.b  0(a3,d1.w),(a4)+ ; Zoom pixel 1
  23274.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23275.       MOVE.b  0(a3,d1.w),(a4)+ ; Zoom pixel 2
  23276.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23277.       MOVE.b  0(a3,d1.w),(a4)+ ; Zoom pixel 3
  23278.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23279.       MOVE.b  0(a3,d1.w),(a4)+ ; Zoom pixel 4
  23280.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23281.       MOVE.b  0(a3,d1.w),(a4)+ ; Zoom pixel 5
  23282.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23283.       MOVE.b  0(a3,d1.w),(a4)+ ; Zoom pixel 6
  23284.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23285.       MOVE.b  0(a3,d1.w),(a4)+ ; Zoom pixel 7
  23286.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23287.       MOVE.b  0(a3,d1.w),(a4)+ ; Zoom pixel 8
  23288.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23289.       MOVE.b  0(a3,d1.w),(a4)+ ; Zoom pixel 9
  23290.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23291.       MOVE.b  0(a3,d1.w),(a4)+ ; Zoom pixel 10
  23292.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23293.       MOVE.b  0(a3,d1.w),(a4)+ ; Zoom pixel 11
  23294.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23295.       MOVE.b  0(a3,d1.w),(a4)+ ; Zoom pixel 12
  23296.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23297.       MOVE.b  0(a3,d1.w),(a4)+ ; Zoom pixel 13
  23298.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23299.       MOVE.b  0(a3,d1.w),(a4)+ ; Zoom pixel 14
  23300.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23301.       MOVE.b  0(a3,d1.w),(a4)+ ; Zoom pixel 15
  23302.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23303.       MOVE.b  0(a3,d1.w),(a4)+ ; Zoom pixel 16
  23304.       ADDX.l   d5,d1 ; SrcX.q+XAdd.q
  23305.       DBRA    d4,PerfZoomX16XLoop
  23306.     ADD.l   d6,a3 ; Source modulo
  23307.     ADD.w   d7,a4 ; Dest modulo
  23308.     DBRA    d0,PerfZoomX16YLoop
  23309.   RTS
  23310. PerfZoomY ; X zoom adder is integer
  23311.   MOVE.l  a5,d2 ; Get SrcX.q
  23312.   SWAP    d2 ; Make SrcX.w
  23313.   MOVE.w  d2,a5 ; store
  23314.   MOVE.w  d4,d2 ; Copy OpWidth
  23315.   SWAP    d5 ; Make XAdd.w
  23316.   TST.w   -6(a2) ; DeRes?
  23317.   BNE     PerfZoomYJump
  23318.   TST.w   d3 ; Is YAdd.q the same as YAdd.w?
  23319.   BEQ     PerfZoomXY ; Yes so we can do integer X and Y loops
  23320. PerfZoomYJump
  23321.   AND.b   #$03,d2 ; Multiple of 4?
  23322.   BEQ     PerfZoomY4
  23323.   SUBQ.w  #1,d4 ; OpWidth-1 for loopcounter
  23324.   TST.w   -6(a2) ; DeRes?
  23325.   BNE     PerfZoomYDeRes
  23326.   CMP.w   #1,d5 ; Is XAdd.w 1?
  23327.   BEQ     PerfZoomY1YLoop
  23328.   EXT.l   d5 ; Clear upper word for lonword add
  23329. PerfZoomYYLoop
  23330.     MOVE.l  a6,d1 ; Get SrcY.q
  23331.     SWAP    d1 ; Get SrcY.w
  23332.     MULU    d6,d1 ; Find Y in source
  23333.     MOVE.l  a3,a0 ; Get Source basePtr
  23334.     MOVE.w  d4,d2 ; Get XLoopcounter
  23335.     ADD.l   d1,a0 ; Point to start of source line
  23336.     ADD.l   a5,a0 ; Add SrcX.w
  23337. PerfZoomYXLoop
  23338.       MOVE.b  (a0),(a4)+ ; zoom pixel 1
  23339.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23340.       DBRA    d2,PerfZoomYXLoop
  23341.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  23342.     ADD.w   d7,a4 ; Dest modulo
  23343.     DBRA    d0,PerfZoomYYLoop
  23344.   RTS
  23345. PerfZoomY1YLoop
  23346.     MOVE.l  a6,d1 ; Get SrcY.q
  23347.     SWAP    d1 ; Get SrcY.w
  23348.     MULU    d6,d1 ; Find Y in source
  23349.     MOVE.l  a3,a0 ; Get Source basePtr
  23350.     MOVE.w  d4,d2 ; Get XLoopcounter
  23351.     ADD.l   d1,a0 ; Point to start of source line
  23352.     ADD.l   a5,a0 ; Add SrcX.w
  23353. PerfZoomY1XLoop
  23354.       MOVE.b  (a0)+,(a4)+ ; zoom pixel 1
  23355.       DBRA    d2,PerfZoomY1XLoop
  23356.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  23357.     ADD.w   d7,a4 ; Dest modulo
  23358.     DBRA    d0,PerfZoomY1YLoop
  23359.   RTS
  23360. PerfZoomYDeRes
  23361.   MOVE.w  d4,a2 ; Store OpWidth-1
  23362.   MOVE.l  a6,d1; Get SrcY.q
  23363.   SWAP    d1 ; Get SrcY.w
  23364.   MOVE.w  d1,d4 ; Store previous integer Y line
  23365.   MULU    d6,d1 ; Find integer Y top
  23366.   MOVE.w  #0,d5 ; Init source integer Y
  23367.   ADD.l   d1,a3 ; Add to base
  23368. PerfZoomYDeResYLoop
  23369.     MOVE.l  a3,a0 ; Get Source basePtr
  23370.     MOVE.w  a2,d2 ; Get OpWidth-1
  23371. PerfZoomYDeResXLoop
  23372.       MOVE.b  (a0)+,(a4)+ ; DeRes pixel 1
  23373.       DBRA    d2,PerfZoomYDeResXLoop
  23374.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  23375.     MOVE.l  a6,d2 ; Get SrcY.q
  23376.     SWAP    d2 ; Get integer part
  23377.     ADD.w   #1,d5 ; Y integer counter
  23378.     CMP.w   d4,d2 ; Y integer change?
  23379.     BNE     PerfZoomYDeResSkipY
  23380.     MOVE.w  d2,d4 ; Current -> Previous
  23381.     ADD.w   d7,a4 ; Dest modulo
  23382.     DBRA    d0,PerfZoomYDeResYLoop
  23383.   RTS
  23384. PerfZoomYDeResSkipY
  23385.     MOVE.w  d2,d4 ; Current -> Previous
  23386.     MOVE.w  d5,d2 ; Get Y integer amount
  23387.     MULU    d6,d2 ; Find Y integer offset
  23388.     MOVE.w  #0,d5 ; Init
  23389.     ADD.l   d2,a3 ; New base
  23390.     ADD.w   d7,a4 ; Dest modulo
  23391.     DBRA    d0,PerfZoomYDeResYLoop
  23392.   RTS
  23393. PerfZoomY4
  23394.   LSR.w   #2,d4 ; OpWidth/4 for groups of 4
  23395.   MOVE.w  d4,d2 ; Copy OpWidth
  23396.   AND.b   #$03,d2 ; Multiple of 16?
  23397.   BEQ     PerfZoomY16
  23398.   SUBQ.w  #1,d4 ; OpWidth-1 for loopcounter
  23399.   TST.w   -6(a2) ; DeRes?
  23400.   BNE     PerfZoomYDeRes4
  23401.   CMP.w   #1,d5 ; Is XAdd.w 1?
  23402.   BEQ     PerfZoomY41YLoop
  23403.   EXT.l   d5 ; Clear upper word for longword add
  23404. PerfZoomY4YLoop
  23405.     MOVE.l  a6,d1 ; Get SrcY.q
  23406.     SWAP    d1 ; Get SrcY.w
  23407.     MULU    d6,d1 ; Find Y in source
  23408.     MOVE.l  a3,a0 ; Get Source basePtr
  23409.     MOVE.w  d4,d2 ; Get XLoopcounter
  23410.     ADD.l   d1,a0 ; Point to start of source line
  23411.     ADD.l   a5,a0 ; Add SrcX.w
  23412. PerfZoomY4XLoop
  23413.       MOVE.b  (a0),(a4)+ ; Zoom pixel 1
  23414.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23415.       MOVE.b  (a0),(a4)+ ; Zoom pixel 2
  23416.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23417.       MOVE.b  (a0),(a4)+ ; Zoom pixel 3
  23418.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23419.       MOVE.b  (a0),(a4)+ ; Zoom pixel 4
  23420.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23421.       DBRA    d2,PerfZoomY4XLoop
  23422.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  23423.     ADD.w   d7,a4 ; Dest modulo
  23424.     DBRA    d0,PerfZoomY4YLoop
  23425.   RTS
  23426. PerfZoomY41YLoop
  23427.     MOVE.l  a6,d1 ; Get SrcY.q
  23428.     SWAP    d1 ; Get SrcY.w
  23429.     MULU    d6,d1 ; Find Y in source
  23430.     MOVE.l  a3,a0 ; Get Source basePtr
  23431.     MOVE.w  d4,d2 ; Get XLoopcounter
  23432.     ADD.l   d1,a0 ; Point to start of source line
  23433.     ADD.l   a5,a0 ; Add SrcX.w
  23434. PerfZoomY41XLoop
  23435.       MOVE.l  (a0)+,(a4)+ ; Zoom 4 pixels
  23436.       DBRA    d2,PerfZoomY41XLoop
  23437.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  23438.     ADD.w   d7,a4 ; Dest modulo
  23439.     DBRA    d0,PerfZoomY41YLoop
  23440.   RTS
  23441. PerfZoomYDeRes4
  23442.   MOVE.w  d4,a2 ; Store OpWidth-1
  23443.   MOVE.l  a6,d1; Get SrcY.q
  23444.   SWAP    d1 ; Get SrcY.w
  23445.   MOVE.w  d1,d4 ; Store previous integer Y line
  23446.   MULU    d6,d1 ; Find integer Y top
  23447.   MOVE.w  #0,d5 ; Init source integer Y
  23448.   ADD.l   d1,a3 ; Add to base
  23449. PerfZoomYDeRes4YLoop
  23450.     MOVE.l  a3,a0 ; Get Source basePtr
  23451.     MOVE.w  a2,d2 ; Get OpWidth-1
  23452. PerfZoomYDeRes4XLoop
  23453.       MOVE.l  (a0)+,(a4)+ ; DeRes 4 pixels
  23454.       DBRA    d2,PerfZoomYDeRes4XLoop
  23455.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  23456.     MOVE.l  a6,d2 ; Get SrcY.q
  23457.     SWAP    d2 ; Get integer part
  23458.     ADD.w   #1,d5 ; Y integer counter
  23459.     CMP.w   d4,d2 ; Y integer change?
  23460.     BNE     PerfZoomYDeRes4SkipY
  23461.     MOVE.w  d2,d4 ; Current -> Previous
  23462.     ADD.w   d7,a4 ; Dest modulo
  23463.     DBRA    d0,PerfZoomYDeRes4YLoop
  23464.   RTS
  23465. PerfZoomYDeRes4SkipY
  23466.     MOVE.w  d2,d4 ; Current -> Previous
  23467.     MOVE.w  d5,d2 ; Get Y integer amount
  23468.     MULU    d6,d2 ; Find Y integer offset
  23469.     MOVE.w  #0,d5 ; Init
  23470.     ADD.l   d2,a3 ; New base
  23471.     ADD.w   d7,a4 ; Dest modulo
  23472.     DBRA    d0,PerfZoomYDeRes4YLoop
  23473.   RTS
  23474. PerfZoomY16
  23475.   LSR.w   #2,d4 ; OpWidth/4 (previously /4) for groups of 16
  23476.   SUBQ.w  #1,d4 ; OpWidth-1 for loopcounter
  23477.   TST.w   -6(a2) ; DeRes?
  23478.   BNE     PerfZoomYDeRes16
  23479.   CMP.w   #1,d5 ; Is XAdd.w 1?
  23480.   BEQ     PerfZoomY161YLoop
  23481.   EXT.l   d5 ; Clear upper word for longword add
  23482. PerfZoomY16YLoop
  23483.     MOVE.l  a6,d1 ; Get SrcY.q
  23484.     SWAP    d1 ; Get SrcY.w
  23485.     MULU    d6,d1 ; Find Y in source
  23486.     MOVE.l  a3,a0 ; Get Source basePtr
  23487.     MOVE.w  d4,d2 ; Get XLoopcounter
  23488.     ADD.l   d1,a0 ; Point to start of source line
  23489.     ADD.l   a5,a0 ; Add SrcX.w
  23490. PerfZoomY16XLoop
  23491.       MOVE.b  (a0),(a4)+ ; Zoom pixel 1
  23492.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23493.       MOVE.b  (a0),(a4)+ ; Zoom pixel 2
  23494.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23495.       MOVE.b  (a0),(a4)+ ; Zoom pixel 3
  23496.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23497.       MOVE.b  (a0),(a4)+ ; Zoom pixel 4
  23498.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23499.       MOVE.b  (a0),(a4)+ ; Zoom pixel 5
  23500.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23501.       MOVE.b  (a0),(a4)+ ; Zoom pixel 6
  23502.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23503.       MOVE.b  (a0),(a4)+ ; Zoom pixel 7
  23504.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23505.       MOVE.b  (a0),(a4)+ ; Zoom pixel 8
  23506.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23507.       MOVE.b  (a0),(a4)+ ; Zoom pixel 9
  23508.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23509.       MOVE.b  (a0),(a4)+ ; Zoom pixel 10
  23510.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23511.       MOVE.b  (a0),(a4)+ ; Zoom pixel 11
  23512.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23513.       MOVE.b  (a0),(a4)+ ; Zoom pixel 12
  23514.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23515.       MOVE.b  (a0),(a4)+ ; Zoom pixel 13
  23516.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23517.       MOVE.b  (a0),(a4)+ ; Zoom pixel 14
  23518.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23519.       MOVE.b  (a0),(a4)+ ; Zoom pixel 15
  23520.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23521.       MOVE.b  (a0),(a4)+ ; Zoom pixel 16
  23522.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23523.       DBRA    d2,PerfZoomY16XLoop
  23524.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  23525.     ADD.w   d7,a4 ; Dest modulo
  23526.     DBRA    d0,PerfZoomY16YLoop
  23527.   RTS
  23528. PerfZoomY161YLoop
  23529.     MOVE.l  a6,d1 ; Get SrcY.q
  23530.     SWAP    d1 ; Get SrcY.w
  23531.     MULU    d6,d1 ; Find Y in source
  23532.     MOVE.l  a3,a0 ; Get Source basePtr
  23533.     MOVE.w  d4,d2 ; Get XLoopcounter
  23534.     ADD.l   d1,a0 ; Point to start of source line
  23535.     ADD.l   a5,a0 ; Add SrcX.w
  23536. PerfZoomY161XLoop
  23537.       MOVE.l  (a0)+,(a4)+ ; Zoom 4 pixels
  23538.       MOVE.l  (a0)+,(a4)+ ; Zoom 4 pixels
  23539.       MOVE.l  (a0)+,(a4)+ ; Zoom 4 pixels
  23540.       MOVE.l  (a0)+,(a4)+ ; Zoom 4 pixels
  23541.       DBRA    d2,PerfZoomY161XLoop
  23542.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  23543.     ADD.w   d7,a4 ; Dest modulo
  23544.     DBRA    d0,PerfZoomY161YLoop
  23545.   RTS
  23546. PerfZoomYDeRes16
  23547.   MOVE.w  d4,a2 ; Store OpWidth-1
  23548.   MOVE.l  a6,d1; Get SrcY.q
  23549.   SWAP    d1 ; Get SrcY.w
  23550.   MOVE.w  d1,d4 ; Store previous integer Y line
  23551.   MULU    d6,d1 ; Find integer Y top
  23552.   MOVE.w  #0,d5 ; Init source integer Y
  23553.   ADD.l   d1,a3 ; Add to base
  23554. PerfZoomYDeRes16YLoop
  23555.     MOVE.l  a3,a0 ; Get Source basePtr
  23556.     MOVE.w  a2,d2 ; Get OpWidth-1
  23557. PerfZoomYDeRes16XLoop
  23558.       MOVE.l  (a0)+,(a4)+ ; DeRes 4 pixel
  23559.       MOVE.l  (a0)+,(a4)+ ; DeRes 8 pixels
  23560.       MOVE.l  (a0)+,(a4)+ ; DeRes 12 pixels
  23561.       MOVE.l  (a0)+,(a4)+ ; DeRes 16 pixels
  23562.       DBRA    d2,PerfZoomYDeRes16XLoop
  23563.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  23564.     MOVE.l  a6,d2 ; Get SrcY.q
  23565.     SWAP    d2 ; Get integer part
  23566.     ADD.w   #1,d5 ; Y integer counter
  23567.     CMP.w   d4,d2 ; Y integer change?
  23568.     BNE     PerfZoomYDeRes16SkipY
  23569.     MOVE.w  d2,d4 ; Current -> Previous
  23570.     ADD.w   d7,a4 ; Dest modulo
  23571.     DBRA    d0,PerfZoomYDeRes16YLoop
  23572.   RTS
  23573. PerfZoomYDeRes16SkipY
  23574.     MOVE.w  d2,d4 ; Current -> Previous
  23575.     MOVE.w  d5,d2 ; Get Y integer amount
  23576.     MULU    d6,d2 ; Find Y integer offset
  23577.     MOVE.w  #0,d5 ; Init
  23578.     ADD.l   d2,a3 ; New base
  23579.     ADD.w   d7,a4 ; Dest modulo
  23580.     DBRA    d0,PerfZoomYDeRes16YLoop
  23581.   RTS
  23582. PerfZoomXY ; X and Y zoom-adders are integer
  23583.   MOVE.l  a6,d1 ; Get SrcY.q
  23584.   SWAP    d1 ; Get SrcY.w
  23585.   MULU    d6,d1 ; Find Y in source
  23586.   SWAP    d3 ; Get YAdd.w
  23587.   MOVE.w  d4,d2 ; Copy OpWidth
  23588.   ADD.l   d1,a3 ; Point
  23589.   MULU    d3,d6 ; YAdd.w*BytesPerLine
  23590.   AND.b   #$03,d2 ; Multiple of 4?
  23591.   BEQ     PerfZoomXY4
  23592.   SUBQ.w  #1,d4 ; OpWidth-1 for loopcounter
  23593.   CMP.w   #1,d5 ; Is XAdd.w 1?
  23594.   BEQ     PerfZoomXY1YLoop
  23595.   EXT.l   d5 ; Wipe upper word ready for add
  23596. PerfZoomXYYLoop
  23597.     MOVE.l  a3,a0 ; Get source base
  23598.     MOVE.w  d4,d2 ; Get XLoopcounter
  23599.     ADD.l   a5,a0 ; Add SrcX.w
  23600. PerfZoomXYXLoop
  23601.       MOVE.b  (a0),(a4)+ ; Zoom pixel 1
  23602.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23603.       DBRA    d2,PerfZoomXYXLoop
  23604.     ADD.l   d6,a3 ; Source modulo
  23605.     ADD.w   d7,a4 ; Dest modulo
  23606.     DBRA    d0,PerfZoomXYYLoop
  23607.   RTS
  23608. PerfZoomXY1YLoop
  23609.     MOVE.l  a3,a0 ; Get source base
  23610.     MOVE.w  d4,d2 ; Get XLoopcounter
  23611.     ADD.l   a5,a0 ; Add SrcX.w
  23612. PerfZoomXY1XLoop
  23613.       MOVE.b  (a0)+,(a4)+ ; Zoom pixel 1
  23614.       DBRA    d2,PerfZoomXY1XLoop
  23615.     ADD.l   d6,a3 ; Source modulo
  23616.     ADD.w   d7,a4 ; Dest modulo
  23617.     DBRA    d0,PerfZoomXY1YLoop
  23618.   RTS
  23619. PerfZoomXY4
  23620.   LSR.w   #2,d4 ; OpWidth/4 for groups of 4
  23621.   MOVE.w  d4,d2 ; Copy OpWidth
  23622.   AND.b   #$03,d2 ; Multiple of 16?
  23623.   BEQ     PerfZoomXY16
  23624.   SUBQ.w  #1,d4 ; OpWidth-1 for loopcounter
  23625.   CMP.w   #1,d5 ; Is XAdd.w 1?
  23626.   BEQ     PerfZoomXY41YLoop
  23627.   EXT.l   d5 ; Wipe upper word ready for add
  23628. PerfZoomXY4YLoop
  23629.     MOVE.l  a3,a0 ; Get source base
  23630.     MOVE.w  d4,d2 ; Get XLoopcounter
  23631.     ADD.l   a5,a0 ; Add SrcX.w
  23632. PerfZoomXY4XLoop
  23633.       MOVE.b  (a0),(a4)+ ; Zoom pixel 1
  23634.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23635.       MOVE.b  (a0),(a4)+ ; Zoom pixel 2
  23636.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23637.       MOVE.b  (a0),(a4)+ ; Zoom pixel 3
  23638.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23639.       MOVE.b  (a0),(a4)+ ; Zoom pixel 4
  23640.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23641.       DBRA    d2,PerfZoomXY4XLoop
  23642.     ADD.l   d6,a3 ; Source modulo
  23643.     ADD.w   d7,a4 ; Dest modulo
  23644.     DBRA    d0,PerfZoomXY4YLoop
  23645.   RTS
  23646. PerfZoomXY41YLoop
  23647.     MOVE.l  a3,a0 ; Get source base
  23648.     MOVE.w  d4,d2 ; Get XLoopcounter
  23649.     ADD.l   a5,a0 ; Add SrcX.w
  23650. PerfZoomXY41XLoop
  23651.       MOVE.l  (a0)+,(a4)+ ; Zoom 4 pixels
  23652.       DBRA    d2,PerfZoomXY41XLoop
  23653.     ADD.l   d6,a3 ; Source modulo
  23654.     ADD.w   d7,a4 ; Dest modulo
  23655.     DBRA    d0,PerfZoomXY41YLoop
  23656.   RTS
  23657. PerfZoomXY16
  23658.   LSR.w   #2,d4 ; OpWidth/4 (previously /4) for groups of 16
  23659.   SUBQ.w  #1,d4 ; OpWidth-1 for loopcounter
  23660.   CMP.w   #1,d5 ; Is XAdd.w 1?
  23661.   BEQ     PerfZoomXY161YLoop
  23662.   EXT.l   d5 ; Wipe upper word ready for add
  23663. PerfZoomXY16YLoop
  23664.     MOVE.l  a3,a0 ; Get source base
  23665.     MOVE.w  d4,d2 ; Get XLoopcounter
  23666.     ADD.l   a5,a0 ; Add SrcX.w
  23667. PerfZoomXY16XLoop
  23668.       MOVE.b  (a0),(a4)+ ; Zoom pixel 1
  23669.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23670.       MOVE.b  (a0),(a4)+ ; Zoom pixel 2
  23671.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23672.       MOVE.b  (a0),(a4)+ ; Zoom pixel 3
  23673.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23674.       MOVE.b  (a0),(a4)+ ; Zoom pixel 4
  23675.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23676.       MOVE.b  (a0),(a4)+ ; Zoom pixel 5
  23677.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23678.       MOVE.b  (a0),(a4)+ ; Zoom pixel 6
  23679.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23680.       MOVE.b  (a0),(a4)+ ; Zoom pixel 7
  23681.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23682.       MOVE.b  (a0),(a4)+ ; Zoom pixel 8
  23683.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23684.       MOVE.b  (a0),(a4)+ ; Zoom pixel 9
  23685.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23686.       MOVE.b  (a0),(a4)+ ; Zoom pixel 10
  23687.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23688.       MOVE.b  (a0),(a4)+ ; Zoom pixel 11
  23689.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23690.       MOVE.b  (a0),(a4)+ ; Zoom pixel 12
  23691.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23692.       MOVE.b  (a0),(a4)+ ; Zoom pixel 13
  23693.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23694.       MOVE.b  (a0),(a4)+ ; Zoom pixel 14
  23695.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23696.       MOVE.b  (a0),(a4)+ ; Zoom pixel 15
  23697.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23698.       MOVE.b  (a0),(a4)+ ; Zoom pixel 16
  23699.       ADD.l   d5,a0 ; Ptr.l+XAdd.w
  23700.       DBRA    d2,PerfZoomXY16XLoop
  23701.     ADD.l   d6,a3 ; Source modulo
  23702.     ADD.w   d7,a4 ; Dest modulo
  23703.     DBRA    d0,PerfZoomXY16YLoop
  23704.   RTS
  23705. PerfZoomXY161YLoop
  23706.     MOVE.l  a3,a0 ; Get source base
  23707.     MOVE.w  d4,d2 ; Get XLoopcounter
  23708.     ADD.l   a5,a0 ; Add SrcX.w
  23709. PerfZoomXY161XLoop
  23710.       MOVE.l  (a0)+,(a4)+ ; Zoom 4 pixels
  23711.       MOVE.l  (a0)+,(a4)+ ; Zoom 8 pixels
  23712.       MOVE.l  (a0)+,(a4)+ ; Zoom 12 pixels
  23713.       MOVE.l  (a0)+,(a4)+ ; Zoom 16 pixels
  23714.       DBRA    d2,PerfZoomXY161XLoop
  23715.     ADD.l   d6,a3 ; Source modulo
  23716.     ADD.w   d7,a4 ; Dest modulo
  23717.     DBRA    d0,PerfZoomXY161YLoop
  23718.   RTS
  23719.  
  23720. PerformCustomZoom
  23721. ;Zoom an area from source to destination resources
  23722. ;Uses CustomOffsets.l to provide different values per row
  23723. ;a0=Source struct
  23724. ;a1=Dest struct
  23725. ;a3=Source data address
  23726. ;a4=Dest data address
  23727. ;a5=SrcX.q
  23728. ;a6=SrcY.q
  23729. ;d2=XAdd.q
  23730. ;d3=YAdd.q
  23731. ;d4=DestX.w
  23732. ;d5=DestY.w
  23733. ;-2(a2)=OpWidth.w
  23734. ;-4(a2)=OpHeight.w
  23735. ;-6(a2)=DeRes?.w
  23736. ;-12(a2)=CustomOffsets.l
  23737. ;Trashes many
  23738.   TST.b   CRsrc_Wrapping-ChunkyResources(a0) ; Source wraps?
  23739.   BEQ     PerfCustomZoomNoSourceWrap
  23740.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a0),a3 ; add wrap
  23741. PerfCustomZoomNoSourceWrap
  23742.   TST.b   CRsrc_Wrapping-ChunkyResources(a1) ; Dest wraps?
  23743.   BEQ     PerfCustomZoomNoDestWrap
  23744.   ADD.l   CRsrc_WrapBytes-ChunkyResources(a1),a4 ; add wrap
  23745. PerfCustomZoomNoDestWrap
  23746.   MOVE.w  CRsrc_Width-ChunkyResources(a1),d7 ; Get dest width
  23747.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a0),d6 ; Source row bytes
  23748.   MOVE.w  CRsrc_TotWidth-ChunkyResources(a1),d1 ; Get dest totwidth
  23749.   SUB.w   -2(a2),d7 ; subtract OpWidth for extra modulo
  23750.   MULU    d5,d1 ; Y offset
  23751.   ADD.w   d4,a4 ; X in dest
  23752.   ADD.w   CRsrc_LineMod-ChunkyResources(a1),d7 ; Total dest modulo
  23753.   MOVE.w  -4(a2),d0 ; Get OpHeight
  23754.   ADD.l   d1,a4 ; XY in dest
  23755.   SUBQ.w  #1,d0 ; Y dest loopcounter
  23756.   MOVE.w  -2(a2),d4 ; Specified OpWidth
  23757.   MOVE.l  d2,d5 ; d5=XAdd.q
  23758.   MOVE.l  -12(a2),a1 ; a1=CustomOffsets.l
  23759.   TST.w   -6(a2) ; DeRes?
  23760.   BNE     PerfCustomZoomDeRes
  23761.   MOVE.w  d4,a2 ; Store specified OpWidth
  23762.   SWAP    d7 ; Store modulo
  23763.   MOVE.w  d6,d7 ; Get rowbytes active, and free up d6
  23764. PerfCustomZoomYLoop
  23765.     MOVE.w  (a1)+,d4 ; Get OpWidth.w
  23766.     MOVE.l  a6,d1 ; Get SrcY.q
  23767.     ADD.w   (a1)+,a4 ; DestX.w+DestXOffset.w
  23768.     SWAP    d1 ; Get SrcY.w
  23769.     ADD.l   (a1)+,a5 ; SrcX.q+SrcXOffset.q
  23770.     MULU    d7,d1 ; Find Y in source
  23771.     ADD.l   (a1)+,d5 ; XAdd.q+XAddOffset.q
  23772.     MOVE.l  a3,a0 ; Get Source basePtr
  23773.     ADD.l   (a1)+,d3 ; YAdd.q+YAddOffset.q
  23774.     MOVE.w  d4,d2 ; Get OpWidth.w
  23775.     ADD.l   d1,a0 ; Point to start of source line
  23776.     MOVE.l  a5,d1 ; Get SrcX.q
  23777.     SWAP    d5 ; Prepare XAdd.q
  23778.     MOVE.w  d2,d6 ; Get OpWidth
  23779.     SWAP    d1 ; Prepare SrcX.q
  23780.     AND.b   #$3,d6 ; Multiple of 4?
  23781.     BNE     PerfCustomZoomX1
  23782.     LSR.w   #2,d2 ; XLoop/4 for groups of 4
  23783.     SUBQ.w  #1,d2 ; XLoopcounter
  23784.     MOVE.l  d5,d6 ; Get XAdd.q swapped
  23785.     CLR.w   d6 ; Wipe integer part
  23786.     ADD.l   d6,d1 ; Prepare extend flag for first addx
  23787. PerfCustomZoomX4Loop
  23788.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 1
  23789.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23790.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 2
  23791.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23792.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 3
  23793.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23794.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 4
  23795.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23796.       DBRA    d2,PerfCustomZoomX4Loop
  23797.     MOVE.w  a2,d1 ; Get OpWidth (without -1)
  23798.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  23799.     SWAP    d7 ; Get modulo
  23800.     SUB.w   d4,d1 ; Find extra dest modulo
  23801.     ADD.w   d7,a4 ; Dest modulo
  23802.     SWAP    d5 ; Restore XAdd.q
  23803.     ADD.w   d1,a4 ; Extra dest modulo
  23804.     SWAP    d7 ; Store modulo
  23805.     DBRA    d0,PerfCustomZoomYLoop
  23806.   RTS
  23807. PerfCustomZoomX1
  23808.     SUBQ.w  #1,d2 ; XLoopcounter
  23809.     MOVE.l  d5,d6 ; Get XAdd.q swapped
  23810.     CLR.w   d6 ; Wipe integer part
  23811.     ADD.l   d6,d1 ; Prepare extend flag for first addx
  23812. PerfCustomZoomXLoop
  23813.       MOVE.b  0(a0,d1.w),(a4)+ ; Zoom pixel 1
  23814.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23815.       DBRA    d2,PerfCustomZoomXLoop
  23816.     MOVE.w  a2,d1 ; Get OpWidth (without -1)
  23817.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  23818.     SWAP    d7 ; Get modulo
  23819.     SUB.w   d4,d1 ; Find extra dest modulo
  23820.     ADD.w   d7,a4 ; Dest modulo
  23821.     SWAP    d5 ; Restore XAdd.q
  23822.     ADD.w   d1,a4 ; Extra dest modulo
  23823.     SWAP    d7 ; Store modulo
  23824.     DBRA    d0,PerfCustomZoomYLoop
  23825.   RTS
  23826. PerfCustomZoomDeRes
  23827.   MOVE.w  d4,a2 ; Store specified OpWidth
  23828.   MOVE.l  a6,d1; Get SrcY.q
  23829.   SWAP    d1 ; Get SrcY.w
  23830.   MOVE.w  d1,d4 ; Store previous integer Y line
  23831.   MOVE.l  a1,LongwordStore ; store base of custom offsets
  23832.   MULU    d6,d1 ; Find integer Y top
  23833.   MOVE.l  #0,a1 ; Init source integer Y
  23834.   ADD.l   d1,a3 ; Add to base
  23835. PerfCustomZoomDeResYLoop
  23836.     MOVE.l  LongwordStore,a0
  23837.     SWAP    d7 ; Store dest modulo
  23838.     MOVE.w  (a0)+,d7 ; Get OpWidth.w
  23839.     SWAP    d0 ; Store YLoop counter
  23840.     ADD.w   (a0)+,a4 ; DestX.w+DestXOffset.w
  23841.     MOVE.w  d7,d0 ; Get for loopcounter
  23842.     ADD.l   (a0)+,a5 ; SrcX.q+SrcXOffset.q
  23843.     ADD.l   (a0)+,d5 ; XAdd.q+XAddOffset.q
  23844.     MOVE.l  a5,d1 ; Get SrcX.q non-swapped
  23845.     ADD.l   (a0)+,d3 ; YAdd.q+YAddOffset.q
  23846.     SWAP    d5 ; Prepare XAdd.q
  23847.     MOVE.l  a0,LongwordStore ; keep custom offsets ptr
  23848.     MOVE.l  d5,d2 ; Get XAdd.q swapped
  23849.     SWAP    d1 ; Prepare SrcX.q
  23850.     SWAP    d6 ; Store
  23851.     CLR.w   d2 ; Wipe integer part
  23852.     MOVE.w  d0,d6 ; Get OpWidth
  23853.     MOVE.l  a3,a0 ; Get Source basePtr
  23854.     AND.b   #$3,d6 ; Multiple of 4?
  23855.     BNE     PerfCustomZoomDeRes1
  23856.     LSR.w   #2,d0 ; OpWidth/4 for groups of 4
  23857.     SWAP    d6 ; Restore
  23858.     SUBQ.w  #1,d0 ; XLoopcounter
  23859.     ADD.l   d2,d1 ; Prepare extend flag (last thing done before the loop!)
  23860.     MOVE.b  (a0)+,d2 ; Get first byte
  23861. PerfCustomZoomDeResXLoop
  23862.       MOVE.b  d2,(a4)+ ; DeRes pixel 1
  23863.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23864.       BCS     PerfCustomZoomDeResSkipX1 ; If so, get new byte
  23865.       MOVE.b  d2,(a4)+ ; DeRes pixel 2
  23866.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23867.       BCS     PerfCustomZoomDeResSkipX2 ; If so, get new byte
  23868.       MOVE.b  d2,(a4)+ ; DeRes pixel 3
  23869.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23870.       BCS     PerfCustomZoomDeResSkipX3 ; If so, get new byte
  23871.       MOVE.b  d2,(a4)+ ; DeRes pixel 4
  23872.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23873.       BCS     PerfCustomZoomDeResSkipX4 ; If so, get new byte
  23874.       ADD.l   #4,a0 ; Scan source
  23875.       DBRA    d0,PerfCustomZoomDeResXLoop
  23876.     MOVE.w  a2,d1 ; Get OpWidth (without -1)
  23877.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  23878.     SUB.w   d7,d1 ; Find extra dest modulo
  23879.     SWAP    d5 ; Restore XAdd.q
  23880.     MOVE.l  a6,d2 ; Get SrcY.q
  23881.     ADD.w   d1,a4 ; Extra dest modulo
  23882.     SWAP    d2 ; Get integer part
  23883.     SWAP    d0 ; Restore YLoop counter
  23884.     ADD.l   #1,a1 ; Y integer counter
  23885.     SWAP    d7 ; Get dest modulo
  23886.     CMP.w   d4,d2 ; Y integer change?
  23887.     BNE     PerfCustomZoomDeResSkipY
  23888.     MOVE.w  d2,d4 ; Current -> Previous
  23889.     ADD.w   d7,a4 ; Dest modulo
  23890.     DBRA    d0,PerfCustomZoomDeResYLoop
  23891.   RTS
  23892. PerfCustomZoomDeResSkipX1
  23893.       MOVE.b  (a0),d2 ; Get new byte
  23894.       MOVE.b  d2,(a4)+ ; DeRes pixel 2
  23895.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23896.       BCS     PerfCustomZoomDeResSkipX2 ; If so, get new byte
  23897.       MOVE.b  d2,(a4)+ ; DeRes pixel 3
  23898.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23899.       BCS     PerfCustomZoomDeResSkipX3 ; If so, get new byte
  23900.       MOVE.b  d2,(a4)+ ; DeRes pixel 4
  23901.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23902.       BCS     PerfCustomZoomDeResSkipX4 ; If so, get new byte
  23903.       ADD.l   #4,a0 ; Scan source
  23904.       DBRA    d0,PerfCustomZoomDeResXLoop
  23905.     MOVE.w  a2,d1 ; Get OpWidth (without -1)
  23906.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  23907.     SUB.w   d7,d1 ; Find extra dest modulo
  23908.     SWAP    d5 ; Restore XAdd.q
  23909.     MOVE.l  a6,d2 ; Get SrcY.q
  23910.     ADD.w   d1,a4 ; Extra dest modulo
  23911.     SWAP    d2 ; Get integer part
  23912.     SWAP    d0 ; Restore YLoop counter
  23913.     ADD.l   #1,a1 ; Y integer counter
  23914.     SWAP    d7 ; Get dest modulo
  23915.     CMP.w   d4,d2 ; Y integer change?
  23916.     BNE     PerfCustomZoomDeResSkipY
  23917.     MOVE.w  d2,d4 ; Current -> Previous
  23918.     ADD.w   d7,a4 ; Dest modulo
  23919.     DBRA    d0,PerfCustomZoomDeResYLoop
  23920.   RTS
  23921. PerfCustomZoomDeResSkipX2
  23922.       MOVE.b  1(a0),d2 ; Get new byte
  23923.       MOVE.b  d2,(a4)+ ; DeRes pixel 3
  23924.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23925.       BCS     PerfCustomZoomDeResSkipX3 ; If so, get new byte
  23926.       MOVE.b  d2,(a4)+ ; DeRes pixel 4
  23927.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23928.       BCS     PerfCustomZoomDeResSkipX4 ; If so, get new byte
  23929.       ADD.l   #4,a0 ; Scan source
  23930.       DBRA    d0,PerfCustomZoomDeResXLoop
  23931.     MOVE.w  a2,d1 ; Get OpWidth (without -1)
  23932.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  23933.     SUB.w   d7,d1 ; Find extra dest modulo
  23934.     SWAP    d5 ; Restore XAdd.q
  23935.     MOVE.l  a6,d2 ; Get SrcY.q
  23936.     ADD.w   d1,a4 ; Extra dest modulo
  23937.     SWAP    d2 ; Get integer part
  23938.     SWAP    d0 ; Restore YLoop counter
  23939.     ADD.l   #1,a1 ; Y integer counter
  23940.     SWAP    d7 ; Get dest modulo
  23941.     CMP.w   d4,d2 ; Y integer change?
  23942.     BNE     PerfCustomZoomDeResSkipY
  23943.     MOVE.w  d2,d4 ; Current -> Previous
  23944.     ADD.w   d7,a4 ; Dest modulo
  23945.     DBRA    d0,PerfCustomZoomDeResYLoop
  23946.   RTS
  23947. PerfCustomZoomDeResSkipX3
  23948.       MOVE.b  2(a0),d2 ; Get new byte
  23949.       MOVE.b  d2,(a4)+ ; DeRes pixel 4
  23950.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23951.       BCS     PerfCustomZoomDeResSkipX4 ; If so, get new byte
  23952.       ADD.l   #4,a0 ; Scan source
  23953.       DBRA    d0,PerfCustomZoomDeResXLoop
  23954.     MOVE.w  a2,d1 ; Get OpWidth (without -1)
  23955.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  23956.     SUB.w   d7,d1 ; Find extra dest modulo
  23957.     SWAP    d5 ; Restore XAdd.q
  23958.     MOVE.l  a6,d2 ; Get SrcY.q
  23959.     ADD.w   d1,a4 ; Extra dest modulo
  23960.     SWAP    d2 ; Get integer part
  23961.     SWAP    d0 ; Restore YLoop counter
  23962.     ADD.l   #1,a1 ; Y integer counter
  23963.     SWAP    d7 ; Get dest modulo
  23964.     CMP.w   d4,d2 ; Y integer change?
  23965.     BNE     PerfCustomZoomDeResSkipY
  23966.     MOVE.w  d2,d4 ; Current -> Previous
  23967.     ADD.w   d7,a4 ; Dest modulo
  23968.     DBRA    d0,PerfCustomZoomDeResYLoop
  23969.   RTS
  23970. PerfCustomZoomDeResSkipX4
  23971.       MOVE.b  3(a0),d2 ; Get new byte
  23972.       ADD.l   #4,a0 ; Scan source
  23973.       DBRA    d0,PerfCustomZoomDeResXLoop
  23974.     MOVE.w  a2,d1 ; Get OpWidth (without -1)
  23975.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  23976.     SUB.w   d7,d1 ; Find extra dest modulo
  23977.     SWAP    d5 ; Restore XAdd.q
  23978.     MOVE.l  a6,d2 ; Get SrcY.q
  23979.     ADD.w   d1,a4 ; Extra dest modulo
  23980.     SWAP    d2 ; Get integer part
  23981.     SWAP    d0 ; Restore YLoop counter
  23982.     ADD.l   #1,a1 ; Y integer counter
  23983.     SWAP    d7 ; Get dest modulo
  23984.     CMP.w   d4,d2 ; Y integer change?
  23985.     BNE     PerfCustomZoomDeResSkipY
  23986.     MOVE.w  d2,d4 ; Current -> Previous
  23987.     ADD.w   d7,a4 ; Dest modulo
  23988.     DBRA    d0,PerfCustomZoomDeResYLoop
  23989.   RTS
  23990. PerfCustomZoomDeRes1
  23991.     SUBQ.w  #1,d0 ; XLoopcounter
  23992.     SWAP    d6 ; Restore
  23993.     ADD.l   d2,d1 ; Prepare extend flag (last thing done before the loop!)
  23994.     MOVE.b  (a0)+,d2 ; Get first byte
  23995. PerfCustomZoomDeRes1XLoop
  23996.       MOVE.b  d2,(a4)+ ; DeRes pixel 1
  23997.       ADDX.l  d5,d1 ; SrcX.q+XAdd.q
  23998.       BCS     PerfCustomZoomDeRes1SkipX ; If so, get new byte
  23999.       ADD.l   #1,a0 ; Scan source
  24000.       DBRA    d0,PerfCustomZoomDeRes1XLoop
  24001.     MOVE.w  a2,d1 ; Get OpWidth (without -1)
  24002.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  24003.     SUB.w   d7,d1 ; Find extra dest modulo
  24004.     SWAP    d5 ; Restore XAdd.q
  24005.     MOVE.l  a6,d2 ; Get SrcY.q
  24006.     ADD.w   d1,a4 ; Extra dest modulo
  24007.     SWAP    d2 ; Get integer part
  24008.     SWAP    d0 ; Restore YLoop counter
  24009.     ADD.l   #1,a1 ; Y integer counter
  24010.     SWAP    d7 ; Get dest modulo
  24011.     CMP.w   d4,d2 ; Y integer change?
  24012.     BNE     PerfCustomZoomDeResSkipY
  24013.     MOVE.w  d2,d4 ; Current -> Previous
  24014.     ADD.w   d7,a4 ; Dest modulo
  24015.     DBRA    d0,PerfCustomZoomDeResYLoop
  24016.   RTS
  24017. PerfCustomZoomDeRes1SkipX
  24018.       MOVE.b  (a0)+,d2 ; Get new byte
  24019.       DBRA    d0,PerfCustomZoomDeRes1XLoop
  24020.     MOVE.w  a2,d1 ; Get OpWidth (without -1)
  24021.     ADD.l   d3,a6 ; SrcY.q+YAdd.q
  24022.     SUB.w   d7,d1 ; Find extra dest modulo
  24023.     SWAP    d5 ; Restore XAdd.q
  24024.     MOVE.l  a6,d2 ; Get SrcY.q
  24025.     ADD.w   d1,a4 ; Extra dest modulo
  24026.     SWAP    d2 ; Get integer part
  24027.     SWAP    d0 ; Restore YLoop counter
  24028.     ADD.l   #1,a1 ; Y integer counter
  24029.     SWAP    d7 ; Get dest modulo
  24030.     CMP.w   d4,d2 ; Y integer change?
  24031.     BNE     PerfCustomZoomDeResSkipY
  24032.     MOVE.w  d2,d4 ; Current -> Previous
  24033.     ADD.w   d7,a4 ; Dest modulo
  24034.     DBRA    d0,PerfCustomZoomDeResYLoop
  24035.   RTS
  24036. PerfCustomZoomDeResSkipY
  24037.     MOVE.w  d2,d4 ; Current -> Previous
  24038.     MOVE.w  a1,d2 ; Get Y integer amount
  24039.     MULU    d6,d2 ; Find Y integer offset
  24040.     MOVE.l  #0,a1 ; Init
  24041.     ADD.l   d2,a3 ; New base
  24042.     ADD.w   d7,a4 ; Dest modulo
  24043.     DBRA    d0,PerfCustomZoomDeResYLoop
  24044.   RTS
  24045.  
  24046. ;*************************************************************************************
  24047.  
  24048.   Even4 ; BEFORE .Data!
  24049.  ._Data
  24050. ;000
  24051. GeneralCPUmode: Dc.b 0 ; 0=000-030, 1=040-060 max cpu allowed to use with regards 040+ instructions such as move16
  24052. SpecificCPUmode:Dc.b 0 ; 0=000, 1=010, 2=020, 3=030, 4=040, 6=060 minimum cpu that is available
  24053. ;002
  24054. Autoc2pWindowsUse: Dc.b 1 ; Automatically use new c2pWindows? 0=No, <>0=Yes
  24055. c2pCPUmode:     Dc.b 1 ; 0=000-030, 1=040-060 c2p routine to use
  24056. ;004
  24057. LongwordStore:  Dc.l 0 ; Temporary storage place to put a longword (any, ie if not enough regs)
  24058. ;008
  24059. c2p_Rows:       Dc.w 0 ; Temporary
  24060. c2p_RowsStore:  Dc.w 0 ; Temporary
  24061. c2p_Pmod:       Dc.w 0 ; Temporary
  24062. c2p_Cmod:       Dc.w 0 ; Temporary
  24063. c2p_Pixels:     Dc.l 0 ; Temporary
  24064. ;020
  24065. c2pWindowsMem:  Dc.l 0 ; Pointer to mem reserved for c2pWindow structures
  24066. c2pWindowsTotal:Dc.w 0 ; Total number of c2p windows (do -1 for highest)
  24067. ;026
  24068. Currentc2pWindows:
  24069. Currentc2pWindow1: Dc.w -1 ; Number of current c2pWindow
  24070. Currentc2pWindow2: Dc.w -1 ; Number of second current c2pWindow
  24071. Currentc2pWindow3: Dc.w -1 ; Number of third current c2pWindow
  24072. ;032
  24073. ;c2pWindow structure, 8 bytes
  24074. c2pWindows
  24075. c2p0_Pixels:    Dc.w 0 ;0 Number of pixels per row, or total number of pixels.l if no modulo
  24076. c2p0_RowsStore: Dc.w 0 ;2 Row counter. Pixels and RowStore need to make a longword (Pixels.l) and thus are consequtive
  24077. c2p0_Pmod:      Dc.w 0 ;4 Planar line modulo
  24078. c2p0_Cmod:      Dc.w 0 ;6 Chunky line modulo
  24079. ;040
  24080.   Dc.l 0 ; Spare
  24081. ;044
  24082.   Dc.l 0 ; Spare
  24083. ;048
  24084. CShape_AutoCookie:   Dc.b 0 ; AutoCookie status for shapes. 0=None, <>0 =ByteForByte
  24085. CBitmap_AutoStencil: Dc.b 0 ; AutoStencil status for bitmaps. 0=None, <>0 =ByteForByte
  24086. CShape_AutoClip:     Dc.b 0 ; AutoClip status for shapes. 0=Off, <>0=On
  24087. CBitmap_AutoClip:    Dc.b 0 ; AutoClip status for bitmaps. 0=Off, <>0=On
  24088. ;052
  24089. CShape_AutoWrap:  Dc.b 0 ; AutoWrap status for shapes. 0=Off, <>0=On automatic handle wrapping
  24090. CBitmap_AutoWrap: Dc.b 0 ; AutoWrap status for bitmaps. 0=Off, <>0=On automatic handle wrapping
  24091. ;054
  24092. CCookie_AutoXFlip:  Dc.b -1 ; Automatic flipping of cookies when flipping shapes horizontally
  24093. CCookie_AutoYFlip:  Dc.b -1 ; Automatic flipping of cookies when flipping shapes vertically
  24094. CStencil_AutoXFlip: Dc.b -1 ; Automatic flipping of stencils when flipping bitmaps horizontally
  24095. CStencil_AutoYFlip: Dc.b -1 ; Automatic flipping of stencils when flipping bitmaps vertically
  24096. ;058
  24097. CurrentCShapes:
  24098. CurrentChunkyShape1: Dc.w -1 ; Number of current ChunkyShape
  24099. CurrentChunkyShape2: Dc.w -1 ; Number of second current ChunkyShape
  24100. CurrentChunkyShape3: Dc.w -1 ; Number of third current ChunkyShape
  24101. ;064
  24102. CurrentCBitmaps:
  24103. CurrentChunkyBitmap1:Dc.w -1 ; Number of current ChunkyBitmap
  24104. CurrentChunkyBitmap2:Dc.w -1 ; Number of second current ChunkyBitmap
  24105. CurrentChunkyBitmap3:Dc.w -1 ; Number of thid current ChunkyBitmap
  24106. ;070
  24107. ChunkyShapesTotal: Dc.w 0 ; Total number of ChunkyShapes (do -1 for highest)
  24108. ChunkyShapesMem:   Dc.l 0 ; Pointer to mem reserved for ChunkyShape structures
  24109. ChunkyBitmapsMem:  Dc.l 0 ; Pointer to mem reserved for ChunkyBitmap structures
  24110. ChunkyBitmapsTotal:Dc.w 0 ; Total number of ChunkyBitmaps (do -1 for highest)
  24111. ;082
  24112. CurrentChunkyShapeBank: Dc.w 0 ; Current Shape bank, 0 as default
  24113. ;084
  24114. AutoChunkyShapesUse:  Dc.b 1 ; Automatically use new ChunkyShapes? 0=No, <>0=Yes
  24115. AutoChunkyBitmapsUse: Dc.b 1 ; Automatically use new ChunkyBitmaps? 0=No, <>0=Yes
  24116. ;086
  24117. _DoubleQBlitModeType:Dc.w 0 ; Type of blit that DoubleQBlit does. 0=Cookie,1=Erase,2=Inv,3=Solid,4=MColourMode,5=MReMapMode,6,7
  24118. _DoubleBlitModeType: Dc.w 0 ; Type of blit that DoubleBlit does. 0=Cookie,1=Erase,2=Inv,3=Solid,4=MColourMode,5=MReMapMode,6,7
  24119. _QBlitModeType:    Dc.w 0 ; Type of blit that QBlit does. 0=Cookie,1=Erase,2=Inv,3=Solid,4=MColourMode,5=MReMapMode,6,7
  24120. _BlitModeType:     Dc.w 0 ; Type of blit that Blit does. 0=Cookie,1=Erase,2=Inv,3=Solid,4=MColourMode,5=MReMapMode,6,7
  24121. _ParticleModeType: Dc.w 4 ; Type of blit that particle routines plot/draw do. 4=MColourMode,5=MReMapMode,6=MSimpleReMapMode,7
  24122. SScrollModeType:   Dc.w 0 ; Type of blit that SScroll and CScroll do. 0=Cookie,1=Erase,2=InvMode,3=SolidMode,4=MColourMode,567
  24123. SMaskScrollModeType: Dc.w 0 ; Type of blit that MSMaskScrolls do. 0=Cookie,1=Erase,2=InvMode,3=SolidMode,4=MColourMode,5,6,7
  24124. DoubleScrollMode:  Dc.b 0 ; Mode that DoubleScrolls use. 0=Paste, <>0=Cut.
  24125. DoubleBlitMode:    Dc.b 0 ; Mode that DoubleBlits use. 0=Paste, <>0=Cut.
  24126. DoubleQBlitMode:   Dc.b 0 ; Mode that DoubleQBlits use. 0=Paste, <>0=Cut.
  24127. _ParticleFormat:   Dc.b 0 ; Format of particle lists and operation to perform. 0=word, <0=quick, >0=address
  24128. ;104
  24129. ;ChunkyResource structure, 64 bytes (bitmaps and shapes)
  24130. ChunkyResources
  24131. CRsrc_Width:    Dc.w 0 ;0  Width of the chunky resource in pixels (=bytes)
  24132. CRsrc_Height:   Dc.w 0 ;2  Height of the chunky resource in pixels (=lines) Must be positioned directly after Width
  24133. CRsrc_LineMod:  Dc.w 0 ;4  Horizontal line modulo - bytes to add at end of line to get to start of next line (usually zero)
  24134. CRsrc_Clipping: Dc.b 0 ;6 Clip window active/deactive. 0=Off, <>0=On
  24135. CRsrc_Wrapping: Dc.b 0 ;7 X&Y Handle-wrapping active/deactive. 0=Normal, <>0=MemoryWrap (add WrapBytes to base address)
  24136. CRsrc_Data:     Dc.l 0 ;8  Pointer to move16-aligned memory containing resource's graphic
  24137. CRsrc_Stencil:  Dc.l 0 ;12 Pointer to move16-aligned memory containing resource's stencil/mask/cookie
  24138. CRsrc_XHandle:  Dc.w 0 ;16 X-Handle coordinate horizontal offset
  24139. CRsrc_YHandle:  Dc.w 0 ;18 Y-Handle coordinate verticle offset
  24140. CRsrc_DMem:     Dc.l 0 ;20 Actual base pointer of memory reserved for data (before move16-alignment)
  24141. CRsrc_DBytes:   Dc.l 0 ;24 Total number of bytes in the resource's graphic mem (before align)
  24142. CRsrc_SMem:     Dc.l 0 ;28 Actual base pointer of memory reserved for stencil (before move16-alignment)
  24143. CRsrc_SBytes:   Dc.l 0 ;32 Total number of bytes in the resource's stencil/mask/cookie (before align)
  24144. CRsrc_DHere:    Dc.b 0 ;36 Graphic data here. 0=Cludged, <>0=CRsrc_DMem is base address
  24145. CRsrc_SHere:    Dc.b 0 ;37 Stencil data here. 0=Cludged, <>0=CRsrc_SMem is base address
  24146. CRsrc_ClipLMod: Dc.w 0 ;38 Clip window horizontal line modulo in bytes compared with bitmap width (additional to LineMod)
  24147. CRsrc_ClipLeft: Dc.w 0 ;40 Clip window's left-edge X coordinate offset
  24148. CRsrc_ClipTop:  Dc.w 0 ;42 Clip window's top-edge Y coordinate offset
  24149. CRsrc_ClipWidth:Dc.w 0 ;44 Clip window's width in pixels
  24150. CRsrc_ClipHight:Dc.w 0 ;46 Clip window's height in pixels
  24151. CRsrc_ClipBytes:Dc.l 0 ;48 Clip window bytes to add to addresses to find topleft corner of clip window
  24152. CRsrc_WrapBytes:Dc.l 0 ;52 Handle bytes to add to base addresses to find topleft XHandle,Yhandle offset
  24153. CRsrc_TotWidth: Dc.w 0 ;56 Width+LineMod, for faster reading of total byte width
  24154. CRsrc_Pad1:     Dc.w 0 ;58
  24155. CRsrc_Pad2:     Dc.l 0 ;60
  24156. ;168
  24157. ChunkyQueuesMem:   Dc.l 0 ; Pointer to where the ChunkyQueue structures are held
  24158. ChunkyQueuesTotal: Dc.w 0 ; Number of ChunkyQueue structures
  24159. AutoChunkyQueuesUse:  Dc.b 1 ; Automatically use new ChunkyQueues? 0=No, <>0=Yes
  24160. ;175
  24161. CurrentInks:
  24162. CurrentInk1: Dc.b 1 ; Current ink to use in graphics routines, default colour
  24163. CurrentInk2: Dc.b 1 ; Second current ink to use
  24164. CurrentInk3: Dc.b 1 ; Third current ink to use
  24165. ;178
  24166. CurrentChunkyQueues:
  24167. CurrentChunkyQueue1: Dc.w -1 ; Number of current ChunkyQueue
  24168. CurrentChunkyQueue2: Dc.w -1 ; Number of second current ChunkyQueue
  24169. CurrentChunkyQueue3: Dc.w -1 ; Number of third current ChunkyQueue
  24170. ;184
  24171. ;ChunkyQueue structure, 16 bytes
  24172. ChunkyQueues
  24173. CQueue_LMem:    Dc.l 0 ;0  Pointer to memory used to store the list. 0=Queue doesn't exist
  24174. CQueue_LBytes:  Dc.l 0 ;4  Bytes of mem reserved
  24175. CQueue_MaxItems:Dc.w 0 ;8  Maximum number of items in the queue
  24176. CQueue_Items:   Dc.w 0 ;10 Actual number of items in the queue
  24177. CQueue_ItemAddr:Dc.l 0 ;12 Memory address of the current item
  24178. ;200
  24179. LineLastXpos: Dc.w 0 ;0 X coordinate of the end of the previously drawn line
  24180. LineLastYpos: Dc.w 0 ;2 Y coordinate of the end of the previously drawn line
  24181. ;204
  24182. ChunkyTablesMem:   Dc.l 0 ; Pointer to where the ChunkyTable structures are held
  24183. ChunkyTablesTotal: Dc.w 0 ; Number of ChunkyTable structures
  24184. AutoChunkyTablesUse:  Dc.b 1 ; Automatically use new ChunkyTables? 0=No, <>0=Yes
  24185.   Dc.b 0 ; Spare
  24186. ;212
  24187. CurrentChunkyTables:
  24188. CurrentChunkyTable1: Dc.w -1 ; Number of current ChunkyTable
  24189. CurrentChunkyTable2: Dc.w -1 ; Number of second current ChunkyTable
  24190. CurrentChunkyTable3: Dc.w -1 ; Number of third current ChunkyTable
  24191. ;218
  24192. _DrawingModeType:  Dc.w 4 ; Type of operation that drawing ops do. 2=InvMode,4=MColourMode,5=MReMapMode,6=MSimpleReMapMode
  24193. ;220
  24194. ;ChunkyTable structure, 16 bytes
  24195. ChunkyTables
  24196. CTable_LMem:    Dc.l 0 ;0  Pointer to memory used to store the list. 0=Table doesn't exist
  24197. CTable_LBytes:  Dc.l 0 ;4  Bytes of mem reserved.Also maximum number of items
  24198. CTable_Items:   Dc.l 0 ;8  Actual number of items in the table
  24199. CTable_ItemAddr:Dc.l 0 ;12 Memory address of the current item
  24200. ;236
  24201. ChunkyShapeBanks
  24202. ;ChunkyShapesMem0:  Dc.l 0 ; ChunkyShapesMem bank 0
  24203. ;ChunkyShapesTotal0:Dc.w 0 ; ChunkyShapesTotal bank 0
  24204. ;ChunkyShapesPad0:  Dc.w 0 ;
  24205.                     Ds.w #NumberOfShapeBanks*8
  24206. ;Next is at 492, with 32 shape banks
  24207.  
  24208. ;== 8< =================== 8< ============================= 8< ================= 8< ==
  24209.   Even4
  24210. RunErrors ; Runtime error routines. Everything below this point is discarded if
  24211.            ; compiled without runtime errorchecking switched on
  24212. .Checks
  24213.  
  24214. ;*************************************************************************************
  24215.  
  24216. _Mc2pCPUmodeCheck
  24217.   TST.b   d0
  24218.   BLT     Error7 ; Too small
  24219.   CMP.b   #6,d0
  24220.   BGT     Error7 ; Too large
  24221.   RTS
  24222.  
  24223. ;*************************************************************************************
  24224.  
  24225. _Mc2pWindowBriefShortCheck
  24226.   !CCheckc2pWindowsExist
  24227.   BRA     _Mc2pWindowCheckFirst3
  24228.   ;RTS not needed
  24229. _Mc2pWindowBriefCheck
  24230.   !CCheckc2pWindowsExist
  24231.   BSR     _Mc2pWindowCheckFirst3
  24232.   TST.b   d3
  24233.   BLT     Error7 ; Too small
  24234.   CMP.b   #6,d3
  24235.   BGT     Error7 ; Too large
  24236.   RTS
  24237. _Mc2pWindowShortCheck
  24238.   !CCheckc2pWindowsExist
  24239.   BSR     _Mc2pWindowCheckFirst3
  24240.   TST.w   d3
  24241.   BLE     Error8 ; Too small or larger than signed word
  24242.   TST.w   d4
  24243.   BLE     Error9 ; Too small or larger than signed word
  24244.   MOVE.w  d4,d7
  24245.   AND.w   #$1F,d7
  24246.   TST.w   d7
  24247.   BNE     Error10 ; Planar Width not multiple of 32
  24248.   TST.w   d5
  24249.   BLE     Error11 ; Too small or larger than signed word
  24250.   RTS
  24251. _Mc2pWindowCheck
  24252.   !CCheckc2pWindowsExist
  24253.   BSR     _Mc2pWindowCheckFirst3
  24254.   TST.w   d3
  24255.   BLE     Error8 ; Too small or larger than signed word
  24256.   TST.b   d4
  24257.   BLT     Error7 ; Too small
  24258.   CMP.b   #6,d4
  24259.   BGT     Error7 ; Too large
  24260.   TST.w   d5
  24261.   BLE     Error9 ; Too small or larger than signed word
  24262.   MOVE.w  d5,d7
  24263.   AND.w   #$1F,d7
  24264.   TST.w   d7
  24265.   BNE     Error10 ; Planar Width not multiple of 32
  24266.   TST.w   d6
  24267.   BLE     Error11 ; Too small or larger than signed word
  24268.   RTS
  24269. _Mc2pWindowCheckFirst3
  24270.   !CCheckc2pWindowNum
  24271.   TST.w   d1
  24272.   BLE     Error4 ; Too small or larger than signed word
  24273.   MOVE.w  d1,d7
  24274.   AND.w   #$1F,d7
  24275.   TST.w   d7
  24276.   BNE     Error5 ; OpWidth not multiple of 32
  24277.   TST.w   d2
  24278.   BLE     Error6 ; Too small or larger than signed word
  24279.   RTS
  24280.  
  24281. ;*************************************************************************************
  24282.  
  24283. _Mc2pWindowWidthShortCheck
  24284.   MOVE.w  Currentc2pWindow1,d0
  24285.   BLT     Error26
  24286. _Mc2pWindowWidthCheck
  24287.   !CThreec2pWindowChecks
  24288.   RTS
  24289.  
  24290. ;*************************************************************************************
  24291.  
  24292. _Mc2pWindowHeightShortCheck
  24293.   MOVE.w  Currentc2pWindow1,d0
  24294.   BLT     Error26
  24295. _Mc2pWindowHeightCheck
  24296.   !CThreec2pWindowChecks
  24297.   RTS
  24298.  
  24299. ;*************************************************************************************
  24300.  
  24301. _Mc2pWindowNewHeightCheck
  24302.   !CThreec2pWindowChecks
  24303.   TST.w   d1
  24304.   BLE     Error3 ; Too small or larger than signed word
  24305.   RTS
  24306.  
  24307. ;*************************************************************************************
  24308.  
  24309. _Mc2pShortestCheck
  24310.   MOVE.l  d0,d5 ; Store
  24311.   MOVE.w  CurrentChunkyBitmap1,d0
  24312.   BLT     Error28
  24313.   !CThreeBitmapChecks
  24314.   MOVE.w  Currentc2pWindow1,d0
  24315.   !CThreec2pWindowChecks
  24316.   MOVE.l  d5,d0 ; Restore
  24317.   TST.l   d0
  24318.   BEQ     Error2 ; Too small
  24319.   RTS
  24320. _Mc2pShortCheck
  24321.   MOVE.l  d0,d5 ; Store
  24322.   MOVE.w  Currentc2pWindow1,d0
  24323.   BLT     Error26
  24324.   !CThreec2pWindowChecks
  24325.   MOVE.l  d5,d0 ; Restore
  24326.   TST.l   d0
  24327.   BEQ     Error1 ; Too small
  24328.   TST.l   d1
  24329.   BEQ     Error2 ; Too small
  24330.   RTS
  24331. _Mc2pCheck
  24332.   !CThreec2pWindowChecks
  24333.   TST.l   d1
  24334.   BEQ     Error1 ; Too small
  24335.   TST.l   d2
  24336.   BEQ     Error2 ; Too small
  24337.   RTS
  24338.  
  24339. ;*************************************************************************************
  24340.  
  24341. _MReservec2pWindowsCheck
  24342.   !CCheckWordParam2
  24343.   RTS
  24344.  
  24345. ;*************************************************************************************
  24346.  
  24347. _MReserveChunkyShapesShortCheck
  24348.   MOVE.w  CurrentChunkyShapeBank,d1
  24349. _MReserveChunkyShapesCheck
  24350.   !CCheckWordParam2
  24351.   TST.w   d1
  24352.   BLT     Error35 ; Too small
  24353.   CMP.w   #NumberOfShapeBanks-1,d1
  24354.   BGT     Error35 ; Too large
  24355.   RTS
  24356.  
  24357. ;*************************************************************************************
  24358.  
  24359. _MReserveChunkyBitmapsCheck
  24360.   !CCheckWordParam2
  24361.   RTS
  24362.  
  24363. ;*************************************************************************************
  24364.  
  24365. _MChunkyShapeCheck
  24366.   !CCheckChunkyShapesExist
  24367.   !CCheckChunkyShapeNum
  24368.   TST.w   d1
  24369.   BLE     Error29
  24370.   TST.w   d2
  24371.   BLE     Error30
  24372.   RTS
  24373.  
  24374. ;*************************************************************************************
  24375.  
  24376. _MChunkyBitmapCheck
  24377.   !CCheckChunkyBitmapsExist
  24378.   !CCheckChunkyBitmapNum
  24379.   TST.w   d1
  24380.   BLE     Error29
  24381.   TST.w   d2
  24382.   BLE     Error30
  24383.   RTS
  24384.  
  24385. ;*************************************************************************************
  24386.  
  24387. _MFreec2pWindowsRangeCheck
  24388. ;Not really feasible to check existence of every c2pWindow in the range
  24389.   !CCheckc2pWindowsExist
  24390.   EXG.l   d0,d1
  24391.   !CCheckc2pWindowNum
  24392.   EXG.l   d0,d1
  24393.   !CCheckc2pWindowNum
  24394.   CMP.w   d0,d1
  24395.   BLT     Error36 ; First>Last
  24396.   RTS
  24397. _MFreec2pWindowsCheck
  24398.   !CCheckc2pWindowsExist
  24399.   RTS
  24400. _MFreec2pWindowCheck
  24401.   !CThreec2pWindowChecks
  24402.   RTS
  24403.  
  24404. ;*************************************************************************************
  24405.  
  24406. _MFreeChunkyShapesRangeCheck
  24407. ;Not really feasible to check existence of every ChunkyShape in the range
  24408.   !CCheckChunkyShapesExist
  24409.   EXG.l   d0,d1
  24410.   !CCheckChunkyShapeNum
  24411.   EXG.l   d0,d1
  24412.   !CCheckChunkyShapeNum
  24413.   CMP.w   d0,d1
  24414.   BLT     Error37 ; First>Last
  24415.   RTS
  24416. _MFreeChunkyShapesCheck
  24417.   !CCheckChunkyShapesExist
  24418.   RTS
  24419. _MFreeChunkyShapeCheck
  24420.   !CThreeShapeChecks
  24421.   RTS
  24422.  
  24423. ;*************************************************************************************
  24424.  
  24425. _MFreeChunkyBitmapsRangeCheck
  24426. ;Not really feasible to check existence of every ChunkyBitmap in the range
  24427.   !CCheckChunkyBitmapsExist
  24428.   EXG.l   d0,d1
  24429.   !CCheckChunkyBitmapNum
  24430.   EXG.l   d0,d1
  24431.   !CCheckChunkyBitmapNum
  24432.   CMP.w   d0,d1
  24433.   BLT     Error38 ; First>Last
  24434.   RTS
  24435. _MFreeChunkyBitmapsCheck
  24436.   !CCheckChunkyBitmapsExist
  24437.   RTS
  24438. _MFreeChunkyBitmapCheck
  24439.   !CThreeBitmapChecks
  24440.   RTS
  24441.  
  24442. ;*************************************************************************************
  24443.  
  24444. _MChunkyShapeWidthShortCheck
  24445.   MOVE.w  CurrentChunkyShape1,d0
  24446.   BLT     Error27
  24447. _MChunkyShapeWidthCheck
  24448.   !CThreeShapeChecks
  24449.   RTS
  24450.  
  24451. ;*************************************************************************************
  24452.  
  24453. _MChunkyBitmapWidthShortCheck
  24454.   MOVE.w  CurrentChunkyBitmap1,d0
  24455.   BLT     Error28
  24456. _MChunkyBitmapWidthCheck
  24457.   !CThreeBitmapChecks
  24458.   RTS
  24459.  
  24460. ;*************************************************************************************
  24461.  
  24462. _MChunkyShapeHeightShortCheck
  24463.   MOVE.w  CurrentChunkyShape1,d0
  24464.   BLT     Error27
  24465. _MChunkyShapeHeightCheck
  24466.   !CThreeShapeChecks
  24467.   RTS
  24468.  
  24469. ;*************************************************************************************
  24470.  
  24471. _MChunkyBitmapHeightShortCheck
  24472.   MOVE.w  CurrentChunkyBitmap1,d0
  24473.   BLT     Error28
  24474. _MChunkyBitmapHeightCheck
  24475.   !CThreeBitmapChecks
  24476.   RTS
  24477.  
  24478. ;*************************************************************************************
  24479.  
  24480. _MAddrc2pWindowShortCheck
  24481.   MOVE.w  Currentc2pWindow1,d0
  24482.   BLT     Error26
  24483. _MAddrc2pWindowCheck
  24484.   !CThreec2pWindowChecks
  24485.   RTS
  24486.  
  24487. ;*************************************************************************************
  24488.  
  24489. _MAddrChunkyShapeShortCheck
  24490.   MOVE.w  CurrentChunkyShape1,d0
  24491.   BLT     Error27
  24492. _MAddrChunkyShapeCheck
  24493.   !CThreeShapeChecks
  24494.   RTS
  24495.  
  24496. ;*************************************************************************************
  24497.  
  24498. _MAddrChunkyBitmapShortCheck
  24499.   MOVE.w  CurrentChunkyBitmap1,d0
  24500.   BLT     Error28
  24501. _MAddrChunkyBitmapCheck
  24502.   !CThreeBitmapChecks
  24503.   RTS
  24504.  
  24505. ;*************************************************************************************
  24506.  
  24507. _MChunkyShapeHandleCheck
  24508.   !CThreeShapeChecks
  24509.   ;Allow signed handle input
  24510.   RTS
  24511.  
  24512. ;*************************************************************************************
  24513.  
  24514. _MChunkyBitmapOriginCheck
  24515.   !CThreeBitmapChecks
  24516.   ;Allow signed origin input
  24517.   RTS
  24518.  
  24519. ;*************************************************************************************
  24520.  
  24521. _MUsec2pWindowCheck
  24522.   EXG.l   d2,d0
  24523.   !CThreec2pWindowChecks
  24524.   EXG.l   d2,d0
  24525. _MUsec2pWindowShortCheck
  24526.   EXG.l   d1,d0
  24527.   !CThreec2pWindowChecks
  24528.   EXG.l   d1,d0
  24529. _MUsec2pWindowShortestCheck
  24530.   !CThreec2pWindowChecks
  24531.   RTS
  24532.  
  24533. ;*************************************************************************************
  24534.  
  24535. _MUseChunkyShapeCheck
  24536.   EXG.l   d2,d0
  24537.   !CThreeShapeChecks
  24538.   EXG.l   d2,d0
  24539. _MUseChunkyShapeShortCheck
  24540.   EXG.l   d1,d0
  24541.   !CThreeShapeChecks
  24542.   EXG.l   d1,d0
  24543. _MUseChunkyShapeShortestCheck
  24544.   !CThreeShapeChecks
  24545.   RTS
  24546.  
  24547. ;*************************************************************************************
  24548.  
  24549. _MUseChunkyBitmapCheck
  24550.   EXG.l   d2,d0
  24551.   !CThreeBitmapChecks
  24552.   EXG.l   d2,d0
  24553. _MUseChunkyBitmapShortCheck
  24554.   EXG.l   d1,d0
  24555.   !CThreeBitmapChecks
  24556.   EXG.l   d1,d0
  24557. _MUseChunkyBitmapShortestCheck
  24558.   !CThreeBitmapChecks
  24559.   RTS
  24560.  
  24561. ;*************************************************************************************
  24562.  
  24563. _MUsedc2pWindowCheck
  24564.   !CCheckc2pWindowsExist
  24565.   TST.w   Currentc2pWindow1
  24566.   BLT     Error26 ; Not used
  24567.   RTS
  24568.  
  24569. ;*************************************************************************************
  24570.  
  24571. _MUsedChunkyShapeCheck
  24572.   !CCheckChunkyShapesExist
  24573.   TST.w   CurrentChunkyShape1
  24574.   BLT     Error27 ; Not used
  24575.   RTS
  24576.  
  24577. ;*************************************************************************************
  24578.  
  24579. _MUsedChunkyBitmapCheck
  24580.   !CCheckChunkyBitmapsExist
  24581.   TST.w   CurrentChunkyBitmap1
  24582.   BLT     Error28 ; Not used
  24583.   RTS
  24584.  
  24585. ;*************************************************************************************
  24586.  
  24587. _MCludgeChunkyShapeCheck
  24588.   !CCheckChunkyShapesExist
  24589.   !CCheckChunkyShapeNum
  24590.   TST.w   d1
  24591.   BLE     Error29
  24592.   TST.w   d2
  24593.   BLE     Error30
  24594.   RTS
  24595.  
  24596. ;*************************************************************************************
  24597.  
  24598. _MCludgeChunkyBitmapCheck
  24599.   !CCheckChunkyBitmapsExist
  24600.   !CCheckChunkyBitmapNum
  24601.   TST.w   d1
  24602.   BLE     Error29
  24603.   TST.w   d2
  24604.   BLE     Error30
  24605.   RTS
  24606.  
  24607. ;*************************************************************************************
  24608.  
  24609. _MMakeChunkyShapeCookiesShortCheck
  24610.   !CCheckChunkyShapesExist
  24611.   RTS
  24612. _MMakeChunkyShapeCookiesCheck
  24613.   EXG.l   d0,d1
  24614.   !CThreeShapeChecks
  24615.   EXG.l   d0,d1
  24616.   !CThreeShapeChecks
  24617.   CMP.w   d0,d1
  24618.   BLT     Error37 ; First>Last
  24619.   RTS
  24620. _MMakeChunkyShapeCookieCheck
  24621.   !CThreeShapeChecks
  24622.   RTS
  24623.  
  24624. ;*************************************************************************************
  24625.  
  24626. _MMakeChunkyBitmapStencilsShortCheck
  24627.   !CCheckChunkyBitmapsExist
  24628.   RTS
  24629. _MMakeChunkyBitmapStencilsCheck
  24630.   EXG.l   d0,d1
  24631.   !CThreeBitmapChecks
  24632.   EXG.l   d0,d1
  24633.   !CThreeBitmapChecks
  24634.   CMP.w   d0,d1
  24635.   BLT     Error38 ; First>Last
  24636.   RTS
  24637. _MMakeChunkyBitmapStencilCheck
  24638.   !CThreeBitmapChecks
  24639.   RTS
  24640.  
  24641. ;*************************************************************************************
  24642.  
  24643. _MFreeChunkyShapeCookiesRangeCheck
  24644. ;Not really feasible to check existence of every ChunkyShape in the range
  24645.   !CCheckChunkyShapesExist
  24646.   EXG.l   d0,d1
  24647.   !CCheckChunkyShapeNum
  24648.   EXG.l   d0,d1
  24649.   !CCheckChunkyShapeNum
  24650.   CMP.w   d0,d1
  24651.   BLT     Error37 ; First>Last
  24652.   RTS
  24653. _MFreeChunkyShapeCookiesCheck
  24654.   !CCheckChunkyShapesExist
  24655.   RTS
  24656. _MFreeChunkyShapeCookieCheck
  24657.   !CThreeShapeChecks
  24658.   RTS
  24659.  
  24660. ;*************************************************************************************
  24661.  
  24662. _MFreeChunkyBitmapStencilsRangeCheck
  24663. ;Not really feasible to check existence of every ChunkyBitmap in the range
  24664.   !CCheckChunkyBitmapsExist
  24665.   EXG.l   d0,d1
  24666.   !CCheckChunkyBitmapNum
  24667.   EXG.l   d0,d1
  24668.   !CCheckChunkyBitmapNum
  24669.   CMP.w   d0,d1
  24670.   BLT     Error38 ; First>Last
  24671.   RTS
  24672. _MFreeChunkyBitmapStencilsCheck
  24673.   !CCheckChunkyBitmapsExist
  24674.   RTS
  24675. _MFreeChunkyBitmapStencilCheck
  24676.   !CThreeBitmapChecks
  24677.   RTS
  24678.  
  24679. ;*************************************************************************************
  24680.  
  24681. _MChunkyShapeWrappingCheck
  24682.   !CThreeShapeChecks
  24683.   RTS
  24684.  
  24685. ;*************************************************************************************
  24686.  
  24687. _MChunkyBitmapWrappingCheck
  24688.   !CThreeBitmapChecks
  24689.   RTS
  24690.  
  24691. ;*************************************************************************************
  24692.  
  24693. _MCludgeChunkyShapeStructCheck
  24694.   EXG.l   d0,d1
  24695.   !CCheckChunkyShapesExist
  24696.   !CCheckChunkyShapeNum ; Dest doesn't have to exist
  24697.   EXG.l   d0,d1
  24698.   !CThreeShapeChecks ; Source MUST exist
  24699.   RTS
  24700.  
  24701. ;*************************************************************************************
  24702.  
  24703. _MCludgeChunkyBitmapStructCheck
  24704.   EXG.l   d0,d1
  24705.   !CCheckChunkyBitmapsExist
  24706.   !CCheckChunkyBitmapNum ; Dest doesn't have to exist
  24707.   EXG.l   d0,d1
  24708.   !CThreeBitmapChecks ; Source MUST exist
  24709.   RTS
  24710.  
  24711. ;*************************************************************************************
  24712.  
  24713. _MCopyc2pWindowStructCheck
  24714.   EXG.l   d0,d1
  24715.   !CCheckc2pWindowsExist
  24716.   !CCheckc2pWindowNum ; Dest doesn't have to exist
  24717.   EXG.l   d0,d1
  24718.   !CThreec2pWindowChecks ; Source MUST exist
  24719.   RTS
  24720.  
  24721. ;*************************************************************************************
  24722.  
  24723. _MChunkyShapeWindowCheck
  24724.   EXG.l   d0,d1
  24725.   !CCheckChunkyShapesExist
  24726.   !CCheckChunkyShapeNum ; Dest doesn't have to exist
  24727.   EXG.l   d0,d1
  24728.   !CThreeShapeChecks ; Source MUST exist
  24729.   !GetShapeObjectPtr ; Base in a0
  24730.   !CCheckWindowFits ; Make sure window fits
  24731.   RTS
  24732.  
  24733. ;*************************************************************************************
  24734.  
  24735. _MChunkyBitmapWindowCheck
  24736.   EXG.l   d0,d1
  24737.   !CCheckChunkyBitmapsExist
  24738.   !CCheckChunkyBitmapNum ; Dest doesn't have to exist
  24739.   EXG.l   d0,d1
  24740.   !CThreeBitmapChecks ; Source MUST exist
  24741.   !GetBitmapObjectPtr ; Base in a0
  24742.   !CCheckWindowFits ; Make sure window fits
  24743.   RTS
  24744.  
  24745. ;*************************************************************************************
  24746.  
  24747. _MChunkyBitmapShapeCheck
  24748.   EXG.l   d0,d1
  24749.   !CCheckChunkyShapesExist
  24750.   !CCheckChunkyShapeNum ; Dest shape doesn't have to exist
  24751.   EXG.l   d0,d1
  24752.   !CThreeBitmapChecks ; Source bitmap MUST exist
  24753.   RTS
  24754.  
  24755. ;*************************************************************************************
  24756.  
  24757. _MChunkyShapesBitmapCheck
  24758.   EXG.l   d0,d1
  24759.   !CCheckChunkyBitmapsExist
  24760.   !CCheckChunkyBitmapNum ; Dest bitmap doesn't have to exist
  24761.   EXG.l   d0,d1
  24762.   !CThreeShapeChecks ; Source shape MUST exist
  24763.   RTS
  24764.  
  24765. ;*************************************************************************************
  24766.  
  24767. _MChunkyShapeXFlipCheck
  24768.   !CThreeShapeChecks
  24769.   RTS
  24770.  
  24771. ;*************************************************************************************
  24772.  
  24773. _MChunkyShapeYFlipCheck
  24774.   !CThreeShapeChecks
  24775.   RTS
  24776.  
  24777. ;*************************************************************************************
  24778.  
  24779. _MChunkyBitmapXFlipCheck
  24780.   !CThreeBitmapChecks
  24781.   RTS
  24782.  
  24783. ;*************************************************************************************
  24784.  
  24785. _MChunkyBitmapYFlipCheck
  24786.   !CThreeBitmapChecks
  24787.   RTS
  24788.  
  24789. ;*************************************************************************************
  24790.  
  24791. _MChunkyCookieXFlipCheck
  24792.   !CThreeShapeChecks
  24793.   !GetShapeObjectPtr ; Base in a0
  24794.   TST.l   CRsrc_SMem-ChunkyResources(a0)
  24795.   BEQ     Error45
  24796.   RTS
  24797.  
  24798. ;*************************************************************************************
  24799.  
  24800. _MChunkyCookieYFlipCheck
  24801.   !CThreeShapeChecks
  24802.   !GetShapeObjectPtr ; Base in a0
  24803.   TST.l   CRsrc_SMem-ChunkyResources(a0)
  24804.   BEQ     Error45
  24805.   RTS
  24806.  
  24807. ;*************************************************************************************
  24808.  
  24809. _MChunkyStencilXFlipCheck
  24810.   !CThreeBitmapChecks
  24811.   !GetBitmapObjectPtr ; Base in a0
  24812.   TST.l   CRsrc_SMem-ChunkyResources(a0)
  24813.   BEQ     Error46
  24814.   RTS
  24815.  
  24816. ;*************************************************************************************
  24817.  
  24818. _MChunkyStencilYFlipCheck
  24819.   !CThreeBitmapChecks
  24820.   !GetBitmapObjectPtr ; Base in a0
  24821.   TST.l   CRsrc_SMem-ChunkyResources(a0)
  24822.   BEQ     Error46
  24823.   RTS
  24824.  
  24825. ;*************************************************************************************
  24826.  
  24827. _MChunkyShapeClipSwitchCheck
  24828.   !CThreeShapeChecks
  24829.   RTS
  24830. _MChunkyShapeClipShortCheck
  24831. _MChunkyShapeClipCheck
  24832.   !CThreeShapeChecks
  24833.   !GetShapeObjectPtr ; Base in a0
  24834.   !CCheckWindowFits2 ; Make sure window fits
  24835.   RTS
  24836.  
  24837. ;*************************************************************************************
  24838.  
  24839. _MChunkyBitmapClipSwitchCheck
  24840.   !CThreeBitmapChecks
  24841.   RTS
  24842. _MChunkyBitmapClipShortCheck
  24843. _MChunkyBitmapClipCheck
  24844.   !CThreeBitmapChecks
  24845.   !GetBitmapObjectPtr ; Base in a0
  24846.   !CCheckWindowFits2 ; Make sure window fits
  24847.   RTS
  24848.  
  24849. ;*************************************************************************************
  24850.  
  24851. _MGetaChunkyShapeShortCheck
  24852. _MGetaChunkyShapeCheck
  24853.   MOVE.l  d0,a1 ; Store
  24854.   MOVE.w  CurrentChunkyBitmap1,d0
  24855.   BLT     Error28
  24856.   !CThreeBitmapChecks
  24857.   !GetBitmapObjectPtr ; Base in a0
  24858.   !CCheckWindowFits2
  24859.   MOVE.l  a1,d0 ; Restore
  24860.   !CCheckChunkyShapesExist
  24861.   !CCheckChunkyShapeNum
  24862.   RTS
  24863.  
  24864. ;*************************************************************************************
  24865.  
  24866. _MGetaChunkyBitmapShortCheck
  24867. _MGetaChunkyBitmapCheck
  24868.   MOVE.l  d0,a1 ; Store
  24869.   MOVE.w  CurrentChunkyShape1,d0
  24870.   BLT     Error27
  24871.   !CThreeShapeChecks
  24872.   !GetShapeObjectPtr ; Base in a0
  24873.   !CCheckWindowFits2
  24874.   MOVE.l  a1,d0 ; Restore
  24875.   !CCheckChunkyBitmapsExist
  24876.   !CCheckChunkyBitmapNum
  24877.   RTS
  24878.  
  24879. ;*************************************************************************************
  24880.  
  24881. _MScrollCustomCheck
  24882.   MOVE.w  -2(a2),d6
  24883.   BRA     _MScrollCheck
  24884. _MScrollShortCheck
  24885. _MBlockScrollShortCheck ; Piggyback
  24886.   MOVE.w  CurrentChunkyBitmap1,d6
  24887.   BLT     Error28
  24888. _MScrollCheck
  24889. _MBlockScrollCheck ; Piggyback
  24890.   MOVE.l  d0,a1 ; Store
  24891.   MOVE.l  d6,d0
  24892.   !CThreeBitmapChecks
  24893.   !GetBitmapObjectPtr ; Base in a0
  24894.   !CCheckSharedScroll
  24895.   RTS
  24896.  
  24897. ;*************************************************************************************
  24898.  
  24899. _MScrollShapeCustomCheck
  24900.   MOVE.w  -2(a2),d6
  24901.   BRA     _MScrollShapeCheck
  24902. _MScrollShapeShortCheck
  24903. _MBlockScrollShapeShortCheck ; Piggyback
  24904.   MOVE.w  CurrentChunkyShape1,d6
  24905.   BLT     Error27
  24906. _MScrollShapeCheck
  24907. _MBlockScrollShapeCheck ; Piggyback
  24908.   MOVE.l  d0,a1 ; Store
  24909.   MOVE.l  d6,d0
  24910.   !CThreeShapeChecks
  24911.   !GetShapeObjectPtr ; Base in a0
  24912.   !CCheckSharedScrollShape
  24913.   RTS
  24914.  
  24915. ;*************************************************************************************
  24916.  
  24917. _MScrollStencilCustomCheck
  24918.   MOVE.w  -2(a2),d6
  24919.   BRA     _MScrollStencilCheck
  24920. _MScrollStencilShortCheck
  24921. _MBlockScrollStencilShortCheck ; Piggyback
  24922.   MOVE.w  CurrentChunkyBitmap1,d6
  24923.   BLT     Error28
  24924. _MScrollStencilCheck
  24925. _MBlockScrollStencilCheck ; Piggyback
  24926.   !CCheckSharedStenScroll
  24927.   RTS
  24928.  
  24929. ;*************************************************************************************
  24930.  
  24931. _MScrollCookieCustomCheck
  24932.   MOVE.w  -2(a2),d6
  24933.   BRA     _MScrollCookieCheck
  24934. _MScrollCookieShortCheck
  24935. _MBlockScrollCookieShortCheck ; Piggyback
  24936.   MOVE.w  CurrentChunkyShape1,d6
  24937.   BLT     Error27
  24938. _MScrollCookieCheck
  24939. _MBlockScrollCookieCheck ; Piggyback
  24940.   !CCheckSharedCookScroll
  24941.   RTS
  24942.  
  24943. ;*************************************************************************************
  24944.  
  24945. _MStencilScrollShortCheck
  24946.   MOVE.w  CurrentChunkyBitmap1,d6
  24947.   BLT     Error28
  24948. _MStencilScrollCheck
  24949.   MOVE.l  d0,a1 ; Store
  24950.   MOVE.l  d6,d0
  24951.   !CThreeBitmapChecks
  24952.   !GetBitmapObjectPtr ; Base in a0
  24953.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Source has stencil?
  24954.   BEQ     Error33
  24955.   !CCheckSharedScroll
  24956.   CMP.w   #5,SScrollModeType
  24957.   BNE     _MStencilScrollCheckSkip
  24958.   TST.w   CurrentChunkyTable1
  24959.   BLT     Error72
  24960. _MStencilScrollCheckSkip
  24961.   CMP.w   #6,SScrollModeType
  24962.   BNE     _MStencilScrollCheckSkip2
  24963.   TST.w   CurrentChunkyTable1
  24964.   BLT     Error72
  24965. _MStencilScrollCheckSkip2
  24966.   RTS
  24967.  
  24968. ;*************************************************************************************
  24969.  
  24970. _MCookieScrollShortCheck
  24971.   MOVE.w  CurrentChunkyShape1,d6
  24972.   BLT     Error27
  24973. _MCookieScrollCheck
  24974.   MOVE.l  d0,a1 ; Store
  24975.   MOVE.l  d6,d0
  24976.   !CThreeShapeChecks
  24977.   !GetShapeObjectPtr ; Base in a0
  24978.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Source has cookie?
  24979.   BEQ     Error31
  24980.   !CCheckSharedScrollShape
  24981.   RTS
  24982.  
  24983. ;*************************************************************************************
  24984.  
  24985. _MStencilScrollStencilShortCheck
  24986.   MOVE.w  CurrentChunkyBitmap1,d6
  24987.   BLT     Error28
  24988. _MStencilScrollStencilCheck
  24989.   !CCheckSharedStenScroll
  24990.   RTS
  24991.  
  24992. ;*************************************************************************************
  24993.  
  24994. _MCookieScrollCookieShortCheck
  24995.   MOVE.w  CurrentChunkyShape1,d6
  24996.   BLT     Error27
  24997. _MCookieScrollCookieCheck
  24998.   !CCheckSharedCookScroll
  24999.   RTS
  25000.  
  25001. ;*************************************************************************************
  25002.  
  25003. _MScrollBitmapToShapeCustomCheck
  25004.   MOVE.w  -2(a2),d6
  25005.   BRA     _MScrollBitmapToShapeCheck
  25006. _MScrollBitmapToShapeShortCheck
  25007. _MBlockScrollBitmapToShapeShortCheck ; Piggyback
  25008.   MOVE.w  CurrentChunkyBitmap1,d6
  25009.   BLT     Error28
  25010. _MScrollBitmapToShapeCheck
  25011. _MBlockScrollBitmapToShapeCheck ; Piggyback
  25012.   MOVE.l  d0,a1 ; Store
  25013.   MOVE.l  d6,d0
  25014.   !CThreeBitmapChecks
  25015.   !GetBitmapObjectPtr ; Base in a0
  25016.   MOVE.l  a1,d0 ; Restore
  25017.   MOVE.l  d6,a1 ; Store
  25018.   !CCheckWindowFits3
  25019.   MOVE.l  a1,d6 ; Restore
  25020.   MOVE.l  d0,a1 ; Store
  25021.   MOVE.w  CurrentChunkyShape1,d0
  25022.   BLT     Error27
  25023.   !CThreeShapeChecks
  25024.   !GetShapeObjectPtr ; Base in a0
  25025.   MOVE.l  a1,d0 ; Restore
  25026.   MOVE.l  d6,a1 ; Store
  25027.   MOVEM.l d0/d1,-(a7) ; Store
  25028.   MOVE.l  d4,d0 ; X2
  25029.   MOVE.l  d5,d1 ; Y2
  25030.   !CCheckWindowFits3
  25031.   MOVEM.l (a7)+,d0/d1 ; Restore
  25032.   MOVE.l  a1,d6 ; Restore
  25033.   RTS
  25034.  
  25035. ;*************************************************************************************
  25036.  
  25037. _MScrollShapeToBitmapCustomCheck
  25038.   MOVE.w  -2(a2),d6
  25039.   BRA     _MScrollShapeToBitmapCheck
  25040. _MScrollShapeToBitmapShortCheck
  25041. _MBlockScrollShapeToBitmapShortCheck ; Piggyback
  25042.   MOVE.w  CurrentChunkyShape1,d6
  25043.   BLT     Error27
  25044. _MScrollShapeToBitmapCheck
  25045. _MBlockScrollShapeToBitmapCheck ; Piggyback
  25046.   MOVE.l  d0,a1 ; Store
  25047.   MOVE.l  d6,d0
  25048.   !CThreeShapeChecks
  25049.   !GetShapeObjectPtr ; Base in a0
  25050.   MOVE.l  a1,d0 ; Restore
  25051.   MOVE.l  d6,a1 ; Store
  25052.   !CCheckWindowFits3
  25053.   MOVE.l  a1,d6 ; Restore
  25054.   MOVE.l  d0,a1 ; Store
  25055.   MOVE.w  CurrentChunkyBitmap1,d0
  25056.   BLT     Error28
  25057.   !CThreeBitmapChecks
  25058.   !GetBitmapObjectPtr ; Base in a0
  25059.   MOVE.l  a1,d0 ; Restore
  25060.   MOVE.l  d6,a1 ; Store
  25061.   MOVEM.l d0/d1,-(a7) ; Store
  25062.   MOVE.l  d4,d0 ; X2
  25063.   MOVE.l  d5,d1 ; Y2
  25064.   !CCheckWindowFits3
  25065.   MOVEM.l (a7)+,d0/d1 ; Restore
  25066.   MOVE.l  a1,d6 ; Restore
  25067.   RTS
  25068.  
  25069. ;*************************************************************************************
  25070.  
  25071. _MStencilScrollBitmapToShapeShortCheck
  25072.   MOVE.w  CurrentChunkyBitmap1,d6
  25073.   BLT     Error28
  25074. _MStencilScrollBitmapToShapeCheck
  25075.   MOVE.l  d0,a1 ; Store
  25076.   MOVE.l  d6,d0
  25077.   !CThreeBitmapChecks
  25078.   !GetBitmapObjectPtr ; Base in a0
  25079.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Source has stencil?
  25080.   BEQ     Error33
  25081.   !CCheckSharedScrollShape
  25082.   RTS
  25083.  
  25084. ;*************************************************************************************
  25085.  
  25086. _MCookieScrollShapeToBitmapShortCheck
  25087.   MOVE.w  CurrentChunkyShape1,d6
  25088.   BLT     Error27
  25089. _MCookieScrollShapeToBitmapCheck
  25090.   MOVE.l  d0,a1 ; Store
  25091.   MOVE.l  d6,d0
  25092.   !CThreeShapeChecks
  25093.   !GetShapeObjectPtr ; Base in a0
  25094.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Source has cookie?
  25095.   BEQ     Error31
  25096.   !CCheckSharedScroll
  25097.   RTS
  25098.  
  25099. ;*************************************************************************************
  25100.  
  25101. _MCPUCheck
  25102.   TST.b   d0
  25103.   BLT     Error7 ; Too small
  25104.   CMP.b   #6,d0
  25105.   BGT     Error7 ; Too large
  25106.   RTS
  25107.  
  25108. ;*************************************************************************************
  25109.  
  25110. _MScrollStencilToCookieCustomCheck
  25111.   MOVE.w  -2(a2),d6
  25112.   BRA     _MScrollStencilToCookieCheck
  25113. _MScrollStencilToCookieShortCheck
  25114. _MBlockScrollStencilToCookieShortCheck ; Piggyback
  25115.   MOVE.w  CurrentChunkyBitmap1,d6
  25116.   BLT     Error28
  25117. _MScrollStencilToCookieCheck
  25118. _MBlockScrollStencilToCookieCheck ; Piggyback
  25119.   MOVE.l  d0,a1 ; Store
  25120.   MOVE.l  d6,d0
  25121.   !CThreeBitmapChecks
  25122.   !GetBitmapObjectPtr ; Base in a0
  25123.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Source has stencil?
  25124.   BEQ     Error33
  25125.   MOVE.l  a1,d0 ; Restore
  25126.   MOVE.l  d6,a1 ; Store
  25127.   !CCheckWindowFits3
  25128.   MOVE.l  a1,d6 ; Restore
  25129.   MOVE.l  d0,a1 ; Store
  25130.   MOVE.w  CurrentChunkyShape1,d0
  25131.   BLT     Error27
  25132.   !CThreeShapeChecks
  25133.   !GetShapeObjectPtr ; Base in a0
  25134.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Dest has cookie?
  25135.   BEQ     Error32
  25136.   MOVE.l  a1,d0 ; Restore
  25137.   MOVE.l  d6,a1 ; Store
  25138.   MOVEM.l d0/d1,-(a7) ; Store
  25139.   MOVE.l  d4,d0 ; X2
  25140.   MOVE.l  d5,d1 ; Y2
  25141.   !CCheckWindowFits3
  25142.   MOVEM.l (a7)+,d0/d1 ; Restore
  25143.   MOVE.l  a1,d6 ; Restore
  25144.   RTS
  25145.  
  25146. ;*************************************************************************************
  25147.  
  25148. _MScrollCookieToStencilCustomCheck
  25149.   MOVE.w  -2(a2),d6
  25150.   BRA     _MScrollCookieToStencilCheck
  25151. _MScrollCookieToStencilShortCheck
  25152. _MBlockScrollCookieToStencilShortCheck ; Piggyback
  25153.   MOVE.w  CurrentChunkyShape1,d6
  25154.   BLT     Error27
  25155. _MScrollCookieToStencilCheck
  25156. _MBlockScrollCookieToStencilCheck ; Piggyback
  25157.   MOVE.l  d0,a1 ; Store
  25158.   MOVE.l  d6,d0
  25159.   !CThreeShapeChecks
  25160.   !GetShapeObjectPtr ; Base in a0
  25161.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Source has cookie?
  25162.   BEQ     Error31
  25163.   MOVE.l  a1,d0 ; Restore
  25164.   MOVE.l  d6,a1 ; Store
  25165.   !CCheckWindowFits3
  25166.   MOVE.l  a1,d6 ; Restore
  25167.   MOVE.l  d0,a1 ; Store
  25168.   MOVE.w  CurrentChunkyBitmap1,d0
  25169.   BLT     Error28
  25170.   !CThreeBitmapChecks
  25171.   !GetBitmapObjectPtr ; Base in a0
  25172.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Dest has stencil?
  25173.   BEQ     Error34
  25174.   MOVE.l  a1,d0 ; Restore
  25175.   MOVE.l  d6,a1 ; Store
  25176.   MOVEM.l d0/d1,-(a7) ; Store
  25177.   MOVE.l  d4,d0 ; X2
  25178.   MOVE.l  d5,d1 ; Y2
  25179.   !CCheckWindowFits3
  25180.   MOVEM.l (a7)+,d0/d1 ; Restore
  25181.   MOVE.l  a1,d6 ; Restore
  25182.   RTS
  25183.  
  25184. ;*************************************************************************************
  25185.  
  25186. _MDoubleStencilScrollBitmapToShapeShortCheck ; Piggyback
  25187.   MOVE.w  CurrentChunkyBitmap1,d6
  25188.   BLT     Error28
  25189. _MDoubleStencilScrollBitmapToShapeCheck
  25190.   CMP.w   #5,SMaskScrollModeType
  25191.   BNE     _MDoubleStencilScrollBTSCheckSkip
  25192.   TST.w   CurrentChunkyTable1
  25193.   BLT     Error72
  25194. _MDoubleStencilScrollBTSCheckSkip
  25195.   CMP.w   #6,SMaskScrollModeType
  25196.   BNE     _MDoubleStencilScrollBTSCheckSkip2
  25197.   TST.w   CurrentChunkyTable1
  25198.   BLT     Error72
  25199. _MDoubleStencilScrollBTSCheckSkip2
  25200.   BRA     _MStencilScrollStencilToCookieCheck
  25201.  
  25202. _MDoubleScrollBitmapToShapeCustomCheck
  25203.   MOVE.w  -2(a2),d6
  25204.   BRA     _MDoubleScrollBitmapToShapeCheck
  25205. _MDoubleBlockScrollBitmapToShapeShortCheck ; Piggyback
  25206. _MDoubleScrollBitmapToShapeShortCheck ; Piggyback
  25207. _MStencilScrollStencilToCookieShortCheck
  25208.   MOVE.w  CurrentChunkyBitmap1,d6
  25209.   BLT     Error28
  25210. _MDoubleBlockScrollBitmapToShapeCheck ; Piggyback
  25211. _MDoubleScrollBitmapToShapeCheck ; Piggyback
  25212. _MStencilScrollStencilToCookieCheck
  25213.   MOVE.l  d0,a1 ; Store
  25214.   MOVE.l  d6,d0
  25215.   !CThreeBitmapChecks
  25216.   !GetBitmapObjectPtr ; Base in a0
  25217.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Source has stencil?
  25218.   BEQ     Error33
  25219.   !CCheckSharedScrollShape
  25220.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Dest has cookie?
  25221.   BEQ     Error32
  25222.   RTS
  25223.  
  25224. ;*************************************************************************************
  25225.  
  25226. _MDoubleCookieScrollShapeToBitmapShortCheck ; Piggyback
  25227.   MOVE.w  CurrentChunkyShape1,d6
  25228.   BLT     Error27
  25229. _MDoubleCookieScrollShapeToBitmapCheck
  25230.   CMP.w   #5,SMaskScrollModeType
  25231.   BNE     _MDoubleCookieScrollSTBCheckSkip
  25232.   TST.w   CurrentChunkyTable1
  25233.   BLT     Error72
  25234. _MDoubleCookieScrollSTBCheckSkip
  25235.   CMP.w   #6,SMaskScrollModeType
  25236.   BNE     _MDoubleCookieScrollSTBCheckSkip2
  25237.   TST.w   CurrentChunkyTable1
  25238.   BLT     Error72
  25239. _MDoubleCookieScrollSTBCheckSkip2
  25240.   BRA     _MCookieScrollCookieToStencilCheck
  25241.  
  25242. _MDoubleScrollShapeToBitmapCustomCheck
  25243.   MOVE.w  -2(a2),d6
  25244.   BRA     _MDoubleScrollShapeToBitmapCheck
  25245. _MDoubleBlockScrollShapeToBitmapShortCheck ; Piggyback
  25246. _MDoubleScrollShapeToBitmapShortCheck ; Piggyback
  25247. _MCookieScrollCookieToStencilShortCheck
  25248.   MOVE.w  CurrentChunkyShape1,d6
  25249.   BLT     Error27
  25250. _MDoubleBlockScrollShapeToBitmapCheck ; Piggyback
  25251. _MDoubleScrollShapeToBitmapCheck ; Piggyback
  25252. _MCookieScrollCookieToStencilCheck
  25253.   MOVE.l  d0,a1 ; Store
  25254.   MOVE.l  d6,d0
  25255.   !CThreeShapeChecks
  25256.   !GetShapeObjectPtr ; Base in a0
  25257.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Source has cookie?
  25258.   BEQ     Error31
  25259.   !CCheckSharedScroll
  25260.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Dest has stencil
  25261.   BEQ     Error34
  25262.   RTS
  25263.  
  25264. ;*************************************************************************************
  25265.  
  25266. _MClsShortCheck
  25267. _MClsCheck
  25268.   MOVE.w  CurrentChunkyBitmap1,d6
  25269.   BLT     Error28
  25270.   EXG.l   d6,d0
  25271.   !CThreeBitmapChecks
  25272.   MOVE.w  _DrawingModeType,d0
  25273.   CMP.w   #4,d0
  25274.   BLE     _MClsCheckSkip
  25275.   TST.w   CurrentChunkyTable1
  25276.   BLT     Error72
  25277. _MClsCheckSkip
  25278.   EXG.l   d6,d0
  25279.   RTS
  25280.  
  25281. ;*************************************************************************************
  25282.  
  25283. _MClsShapeShortCheck
  25284. _MClsShapeCheck
  25285.   MOVE.w  CurrentChunkyShape1,d6
  25286.   BLT     Error27
  25287.   EXG.l   d6,d0
  25288.   !CThreeShapeChecks
  25289.   MOVE.w  _DrawingModeType,d0
  25290.   CMP.w   #4,d0
  25291.   BLE     _MClsShapeCheckSkip
  25292.   TST.w   CurrentChunkyTable1
  25293.   BLT     Error72
  25294. _MClsShapeCheckSkip
  25295.   EXG.l   d6,d0
  25296.   RTS
  25297.  
  25298. ;*************************************************************************************
  25299.  
  25300. _MClsStencilShortCheck
  25301. _MClsStencilCheck
  25302.   MOVE.w  CurrentChunkyBitmap1,d6
  25303.   BLT     Error28
  25304.   EXG.l   d6,d0
  25305.   !CThreeBitmapChecks
  25306.   !GetBitmapObjectPtr ; Base in a0
  25307.   EXG.l   d6,d0
  25308.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has stencil?
  25309.   BEQ     Error46
  25310.   RTS
  25311.  
  25312. ;*************************************************************************************
  25313.  
  25314. _MClsCookieShortCheck
  25315. _MClsCookieCheck
  25316.   MOVE.w  CurrentChunkyShape1,d6
  25317.   BLT     Error27
  25318.   EXG.l   d6,d0
  25319.   !CThreeShapeChecks
  25320.   !GetShapeObjectPtr ; Base in a0
  25321.   EXG.l   d6,d0
  25322.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has cookie?
  25323.   BEQ     Error45
  25324.   RTS
  25325.  
  25326. ;*************************************************************************************
  25327.  
  25328. _MPointCheck ; Piggyback
  25329.   MOVE.l  d0,d6
  25330.   MOVE.w  d2,d0
  25331.   BLT     Error28
  25332.   BRA     _MPointCheckSkip
  25333. _MPlotShortCheck
  25334. _MPlotCheck
  25335.   MOVE.w  _DrawingModeType,d7
  25336.   CMP.w   #4,d7
  25337.   BLE     _MPlotCheckSkip
  25338.   TST.w   CurrentChunkyTable1
  25339.   BLT     Error53
  25340. _MPointShortCheck ; Piggyback
  25341. _MPlotCheckSkip
  25342.   MOVE.l  d0,d6 ; Store Xpos
  25343.   MOVE.w  CurrentChunkyBitmap1,d0
  25344.   BLT     Error28
  25345. _MPointCheckSkip
  25346.   !CThreeBitmapChecks
  25347.   !GetBitmapObjectPtr ; Base in a0
  25348.   MOVE.l  d6,d0 ; Restore Xpos
  25349.   !CCheckXYFits
  25350.   RTS
  25351.  
  25352. ;*************************************************************************************
  25353.  
  25354. _MPointShapeCheck ; Piggyback
  25355.   MOVE.l  d0,d6
  25356.   MOVE.w  d2,d0
  25357.   BLT     Error27
  25358.   BRA     _MPointShapeCheckSkip
  25359. _MPlotShapeShortCheck
  25360. _MPlotShapeCheck
  25361.   MOVE.w  _DrawingModeType,d7
  25362.   CMP.w   #4,d7
  25363.   BLE     _MPlotShapeCheckSkip
  25364.   TST.w   CurrentChunkyTable1
  25365.   BLT     Error53
  25366. _MPointShapeShortCheck ; Piggyback
  25367. _MPlotShapeCheckSkip
  25368.   MOVE.l  d0,d6 ; Store Xpos
  25369.   MOVE.w  CurrentChunkyShape1,d0
  25370.   BLT     Error27
  25371. _MPointShapeCheckSkip
  25372.   !CThreeShapeChecks
  25373.   !GetShapeObjectPtr ; Base in a0
  25374.   MOVE.l  d6,d0 ; Restore Xpos
  25375.   !CCheckXYFits
  25376.   RTS
  25377.  
  25378. ;*************************************************************************************
  25379.  
  25380. _MPointStencilCheck ; Piggyback
  25381.   MOVE.l  d0,d6
  25382.   MOVE.w  d2,d0
  25383.   BLT     Error28
  25384.   BRA     _MPointStencilCheckSkip
  25385. _MPlotStencilShortCheck
  25386. _MPointStencilShortCheck ; Piggyback
  25387. _MPlotStencilCheck
  25388.   MOVE.l  d0,d6 ; Store Xpos
  25389.   MOVE.w  CurrentChunkyBitmap1,d0
  25390.   BLT     Error28
  25391. _MPointStencilCheckSkip
  25392.   !CThreeBitmapChecks
  25393.   !GetBitmapObjectPtr ; Base in a0
  25394.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has stencil?
  25395.   BEQ     Error44
  25396.   MOVE.l  d6,d0 ; Restore Xpos
  25397.   !CCheckXYFits
  25398.   RTS
  25399.  
  25400. ;*************************************************************************************
  25401.  
  25402. _MPointCookieCheck ; Piggyback
  25403.   MOVE.l  d0,d6
  25404.   MOVE.w  d2,d0
  25405.   BLT     Error27
  25406.   BRA     _MPointCookieCheckSkip
  25407. _MPlotCookieShortCheck
  25408. _MPointCookieShortCheck ; Piggyback
  25409. _MPlotCookieCheck
  25410.   MOVE.l  d0,d6 ; Store Xpos
  25411.   MOVE.w  CurrentChunkyShape1,d0
  25412.   BLT     Error27
  25413. _MPointCookieCheckSkip
  25414.   !CThreeShapeChecks
  25415.   !GetShapeObjectPtr ; Base in a0
  25416.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has cookie?
  25417.   BEQ     Error45
  25418.   MOVE.l  d6,d0 ; Restore Xpos
  25419.   !CCheckXYFits
  25420.   RTS
  25421.  
  25422. ;*************************************************************************************
  25423.  
  25424. _MDoubleStencilScrollShortCheck ; Piggyback
  25425.   MOVE.w  CurrentChunkyBitmap1,d6
  25426.   BLT     Error28
  25427. _MDoubleStencilScrollCheck
  25428.   CMP.w   #5,SMaskScrollModeType
  25429.   BNE     _MDoubleStencilScrollCheckSkip
  25430.   TST.w   CurrentChunkyTable1
  25431.   BLT     Error72
  25432. _MDoubleStencilScrollCheckSkip
  25433.   CMP.w   #6,SMaskScrollModeType
  25434.   BNE     _MDoubleStencilScrollCheckSkip2
  25435.   TST.w   CurrentChunkyTable1
  25436.   BLT     Error72
  25437. _MDoubleStencilScrollCheckSkip2
  25438.   BRA     _MDoubleScrollCheck
  25439.  
  25440. _MDoubleScrollCustomCheck
  25441.   MOVE.w  -2(a2),d6
  25442.   BRA     _MDoubleScrollCheck
  25443. _MDoubleBlockScrollShortCheck ; Piggyback
  25444. _MDoubleScrollShortCheck
  25445.   MOVE.w  CurrentChunkyBitmap1,d6
  25446.   BLT     Error28
  25447. _MDoubleBlockScrollCheck ; Piggyback
  25448. _MDoubleScrollCheck
  25449.   MOVE.l  d0,a1 ; Store
  25450.   MOVE.l  d6,d0
  25451.   !CThreeBitmapChecks
  25452.   !GetBitmapObjectPtr ; Base in a0
  25453.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Source has stencil?
  25454.   BEQ     Error33
  25455.   !CCheckSharedScroll
  25456.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Dest has stencil?
  25457.   BEQ     Error34
  25458.   RTS
  25459.  
  25460. ;*************************************************************************************
  25461.  
  25462. _MDoubleCookieScrollShortCheck ; Piggyback
  25463.   MOVE.w  CurrentChunkyShape1,d6
  25464.   BLT     Error27
  25465. _MDoubleCookieScrollCheck
  25466.   CMP.w   #5,SMaskScrollModeType
  25467.   BNE     _MDoubleCookieScrollCheckSkip
  25468.   TST.w   CurrentChunkyTable1
  25469.   BLT     Error72
  25470. _MDoubleCookieScrollCheckSkip
  25471.   CMP.w   #6,SMaskScrollModeType
  25472.   BNE     _MDoubleCookieScrollCheckSkip2
  25473.   TST.w   CurrentChunkyTable1
  25474.   BLT     Error72
  25475. _MDoubleCookieScrollCheckSkip2
  25476.   BRA     _MDoubleScrollShapeCheck
  25477.  
  25478. _MDoubleScrollShapeCustomCheck
  25479.   MOVE.w  -2(a2),d6
  25480.   BRA     _MDoubleScrollShapeCheck
  25481. _MDoubleBlockScrollShapeShortCheck ; Piggyback
  25482. _MDoubleScrollShapeShortCheck
  25483.   MOVE.w  CurrentChunkyShape1,d6
  25484.   BLT     Error27
  25485. _MDoubleBlockScrollShapeCheck ; Piggyback
  25486. _MDoubleScrollShapeCheck
  25487.   MOVE.l  d0,a1 ; Store
  25488.   MOVE.l  d6,d0
  25489.   !CThreeShapeChecks
  25490.   !GetShapeObjectPtr ; Base in a0
  25491.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Source has cookie?
  25492.   BEQ     Error31
  25493.   !CCheckSharedScrollShape
  25494.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Dest has cookie?
  25495.   BEQ     Error32
  25496.   RTS
  25497.  
  25498. ;*************************************************************************************
  25499.  
  25500. _MUseChunkyShapeBankCheck
  25501.   TST.w   d0
  25502.   BLT     Error35 ; Too small
  25503.   CMP.w   #NumberOfShapeBanks-1,d0
  25504.   BGT     Error35 ; Too large
  25505.   RTS
  25506.  
  25507. ;*************************************************************************************
  25508.  
  25509. _MPictureDissolveInCheck
  25510.   !CThreeBitmapChecks
  25511.   MOVE.l  d0,d4 ; Store
  25512.   MOVE.w  CurrentChunkyBitmap1,d0
  25513.   BLT     Error47
  25514.   !CThreeBitmapChecks
  25515.   !GetBitmapObjectPtr ; Base of source in a1
  25516.   MOVE.l  a0,a1
  25517.   MOVE.w  CurrentChunkyBitmap2,d0
  25518.   BLT     Error48
  25519.   !CThreeBitmapChecks
  25520.   !GetBitmapObjectPtr ; Base of dest in a2
  25521.   MOVE.l  a0,a2
  25522.   MOVE.l  d4,d0 ; Restore
  25523.   !GetBitmapObjectPtr ; Base of pic in a0
  25524.   TST.b   CRsrc_Clipping-ChunkyResources(a2) ; Dest clip?
  25525.   BEQ     _MPictureDissolveInCheckNoClip
  25526.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d7
  25527.   CMP.w   CRsrc_ClipWidth-ChunkyResources(a2),d7 ; Same?
  25528.   BNE     Error49 ; Pic has different sized clip area
  25529.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d7
  25530.   CMP.w   CRsrc_ClipHight-ChunkyResources(a2),d7 ; Same?
  25531.   BNE     Error49 ; Pic has different sized clip area
  25532.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a1),d7
  25533.   CMP.w   CRsrc_ClipWidth-ChunkyResources(a2),d7 ; Same?
  25534.   BNE     Error50 ; Source has different sized clip area
  25535.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a1),d7
  25536.   CMP.w   CRsrc_ClipHight-ChunkyResources(a2),d7 ; Same?
  25537.   BNE     Error50 ; Source has different sized clip area
  25538.   RTS
  25539. _MPictureDissolveInCheckNoClip
  25540.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d7
  25541.   CMP.w   CRsrc_Width-ChunkyResources(a2),d7 ; Same?
  25542.   BNE     Error51 ; Pic has different size
  25543.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d7
  25544.   CMP.w   CRsrc_Height-ChunkyResources(a2),d7 ; Same?
  25545.   BNE     Error51 ; Pic has different size
  25546.   MOVE.w  CRsrc_Width-ChunkyResources(a1),d7
  25547.   CMP.w   CRsrc_Width-ChunkyResources(a2),d7 ; Same?
  25548.   BNE     Error52 ; Source has different size
  25549.   MOVE.w  CRsrc_Height-ChunkyResources(a1),d7
  25550.   CMP.w   CRsrc_Height-ChunkyResources(a2),d7 ; Same?
  25551.   BNE     Error52 ; Source has different size
  25552.   RTS
  25553.  
  25554. ;*************************************************************************************
  25555.  
  25556. _MDoubleQBlitModeCheck ; Piggyback
  25557. _MDoubleBlitModeCheck ; Piggyback
  25558. _MQBlitModeCheck ; Piggyback
  25559. _MBlitModeCheck ; Piggyback
  25560. _MSScrollModeCheck
  25561. _MSMaskScrollModeCheck
  25562.   CMP.w   #8,d0 ; Direct?
  25563.   BGE     _MSScrollModeCheckSkip
  25564.   TST.w   d0
  25565.   BLT     Error54 ; Negative mode number not allowed
  25566.   RTS
  25567. _MSScrollModeCheckSkip
  25568.   CMP.w   #_CookieMode,d0
  25569.   BEQ     _MSScrollModeCheckDone
  25570.   CMP.w   #_EraseMode,d0
  25571.   BEQ     _MSScrollModeCheckDone
  25572.   CMP.w   #_InvMode,d0
  25573.   BEQ     _MSScrollModeCheckDone
  25574.   CMP.w   #_SolidMode,d0
  25575.   BEQ     _MSScrollModeCheckDone
  25576.   BRA     Error53 ; None of the correct modes, so fail
  25577. _MSScrollModeCheckDone
  25578.   RTS
  25579.  
  25580. ;*************************************************************************************
  25581.  
  25582. _MBlitShortCheck
  25583.   MOVE.w  d1,d2
  25584.   MOVE.w  d0,d1
  25585.   MOVE.w  CurrentChunkyShape1,d0
  25586.   BLT     Error27
  25587.   BSR     _MBlitCheck
  25588.   MOVE.w  d1,d0
  25589.   MOVE.w  d2,d1
  25590.   RTS
  25591. _MBlitCheck
  25592.   !CThreeShapeChecks
  25593.   !GetShapeObjectPtr ; Base in a0
  25594.   MOVEM.w d1/d2,-(a7) ; Store
  25595.   SUB.w   CRsrc_XHandle-ChunkyResources(a0),d1 ; Adjust Xpos
  25596.   SUB.w   CRsrc_YHandle-ChunkyResources(a0),d2 ; Adjust Ypos
  25597.   MOVE.w  d0,a1 ; Store
  25598.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d3 ; OpWidth
  25599.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d4 ; OpHeight
  25600.   MOVE.w  CurrentChunkyBitmap1,d0
  25601.   BLT     Error28
  25602.   !CThreeBitmapChecks
  25603.   !GetBitmapObjectPtr ; Base in a0
  25604.   !CCheckWindowFits2
  25605.   MOVE.w  a1,d0 ; Restore
  25606.   MOVEM.w (a7)+,d1/d2 ; Restore
  25607.   CMP.w   #5,_BlitModeType
  25608.   BNE     _MBlitCheckSkip
  25609.   TST.w   CurrentChunkyTable1
  25610.   BLT     Error72
  25611. _MBlitCheckSkip
  25612.   CMP.w   #6,_BlitModeType
  25613.   BNE     _MBlitCheckSkip2
  25614.   TST.w   CurrentChunkyTable1
  25615.   BLT     Error72
  25616. _MBlitCheckSkip2
  25617.   RTS
  25618.  
  25619. ;*************************************************************************************
  25620.  
  25621. _MBlockShortCheck
  25622.   MOVE.w  d1,d2
  25623.   MOVE.w  d0,d1
  25624.   MOVE.w  CurrentChunkyShape1,d0
  25625.   BLT     Error27
  25626.   BSR     _MBlockCheck
  25627.   MOVE.w  d1,d0
  25628.   MOVE.w  d2,d1
  25629.   RTS
  25630. _MBlockCheck
  25631.   MOVE.w  d0,a1 ; Store
  25632.   !CThreeShapeChecks
  25633.   !GetShapeObjectPtr ; Base in a0
  25634.   MOVEM.w d1/d2,-(a7) ; Store
  25635.   SUB.w   CRsrc_XHandle-ChunkyResources(a0),d1 ; Adjust Xpos
  25636.   SUB.w   CRsrc_YHandle-ChunkyResources(a0),d2 ; Adjust Ypos
  25637.   AND.b   #$F0,d1 ; X crop to 16 align
  25638.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d3 ; OpWidth
  25639.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d4 ; OpHeight
  25640.   MOVE.w  d3,d5 ; Copy width
  25641.   AND.b   #$0F,d5 ; Aligned width?
  25642.   BNE     Error55
  25643.   MOVE.w  CurrentChunkyBitmap1,d0
  25644.   BLT     Error28
  25645.   !CThreeBitmapChecks
  25646.   !GetBitmapObjectPtr ; Base in a0
  25647.   !CCheckWindowFits2
  25648.   MOVE.w  a1,d0 ; Restore
  25649.   MOVEM.w (a7)+,d1/d2
  25650.   RTS
  25651.  
  25652. ;*************************************************************************************
  25653.  
  25654. _MTile16x16ShortCheck
  25655.   MOVE.w  d1,d2
  25656.   MOVE.w  d0,d1
  25657.   MOVE.w  CurrentChunkyShape1,d0
  25658.   BLT     Error27
  25659.   BSR     _MTile16x16Check
  25660.   MOVE.w  d1,d0
  25661.   MOVE.w  d2,d1
  25662.   RTS
  25663. _MTile16x16Check
  25664.   AND.b   #$F0,d1 ; X crop to 16 align
  25665.   AND.b   #$F0,d2 ; Y crop to 16 align
  25666.   !CThreeShapeChecks
  25667.   !GetShapeObjectPtr ; Base in a0
  25668.   MOVE.w  d0,a1 ; Store
  25669.   MOVEQ.l #16,d3 ; OpWidth
  25670.   MOVEQ.l #16,d4 ; OpHeight
  25671.   MOVE.w  CurrentChunkyBitmap1,d0
  25672.   BLT     Error28
  25673.   !CThreeBitmapChecks
  25674.   !GetBitmapObjectPtr ; Base in a0
  25675.   !CCheckWindowFits2
  25676.   MOVE.w  a1,d0 ; Restore
  25677.   RTS
  25678.  
  25679. ;*************************************************************************************
  25680.  
  25681. _MTile32x32ShortCheck
  25682.   MOVE.w  d1,d2
  25683.   MOVE.w  d0,d1
  25684.   MOVE.w  CurrentChunkyShape1,d0
  25685.   BLT     Error27
  25686.   BSR     _MTile32x32Check
  25687.   MOVE.w  d1,d0
  25688.   MOVE.w  d2,d1
  25689.   RTS
  25690. _MTile32x32Check
  25691.   AND.b   #$E0,d1 ; X crop to 32 align
  25692.   AND.b   #$E0,d2 ; Y crop to 32 align
  25693.   !CThreeShapeChecks
  25694.   !GetShapeObjectPtr ; Base in a0
  25695.   MOVE.w  d0,a1 ; Store
  25696.   MOVEQ.l #32,d3 ; OpWidth
  25697.   MOVEQ.l #32,d4 ; OpHeight
  25698.   MOVE.w  CurrentChunkyBitmap1,d0
  25699.   BLT     Error28
  25700.   !CThreeBitmapChecks
  25701.   !GetBitmapObjectPtr ; Base in a0
  25702.   !CCheckWindowFits2
  25703.   MOVE.w  a1,d0 ; Restore
  25704.   RTS
  25705.  
  25706. ;*************************************************************************************
  25707.  
  25708. _MDoubleTile16x16ShortCheck
  25709.   MOVE.w  d1,d2
  25710.   MOVE.w  d0,d1
  25711.   MOVE.w  CurrentChunkyShape1,d0
  25712.   BLT     Error27
  25713.   BSR     _MDoubleTile16x16Check
  25714.   MOVE.w  d1,d0
  25715.   MOVE.w  d2,d1
  25716.   RTS
  25717. _MDoubleTile16x16Check
  25718.   AND.b   #$F0,d1 ; X crop to 16 align
  25719.   AND.b   #$F0,d2 ; Y crop to 16 align
  25720.   !CThreeShapeChecks
  25721.   !GetShapeObjectPtr ; Base in a0
  25722.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has cookie?
  25723.   BEQ     Error31
  25724.   MOVE.w  d0,a1 ; Store
  25725.   MOVEQ.l #16,d3 ; OpWidth
  25726.   MOVEQ.l #16,d4 ; OpHeight
  25727.   MOVE.w  CurrentChunkyBitmap1,d0
  25728.   BLT     Error28
  25729.   !CThreeBitmapChecks
  25730.   !GetBitmapObjectPtr ; Base in a0
  25731.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has stencil?
  25732.   BEQ     Error34
  25733.   !CCheckWindowFits2
  25734.   MOVE.w  a1,d0 ; Restore
  25735.   RTS
  25736.  
  25737. ;*************************************************************************************
  25738.  
  25739. _MDoubleTile32x32ShortCheck
  25740.   MOVE.w  d1,d2
  25741.   MOVE.w  d0,d1
  25742.   MOVE.w  CurrentChunkyShape1,d0
  25743.   BLT     Error27
  25744.   BSR     _MDoubleTile32x32Check
  25745.   MOVE.w  d1,d0
  25746.   MOVE.w  d2,d1
  25747.   RTS
  25748. _MDoubleTile32x32Check
  25749.   AND.b   #$E0,d1 ; X crop to 32 align
  25750.   AND.b   #$E0,d2 ; Y crop to 32 align
  25751.   !CThreeShapeChecks
  25752.   !GetShapeObjectPtr ; Base in a0
  25753.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has cookie?
  25754.   BEQ     Error31
  25755.   MOVE.w  d0,a1 ; Store
  25756.   MOVEQ.l #32,d3 ; OpWidth
  25757.   MOVEQ.l #32,d4 ; OpHeight
  25758.   MOVE.w  CurrentChunkyBitmap1,d0
  25759.   BLT     Error28
  25760.   !CThreeBitmapChecks
  25761.   !GetBitmapObjectPtr ; Base in a0
  25762.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has stencil?
  25763.   BEQ     Error34
  25764.   !CCheckWindowFits2
  25765.   MOVE.w  a1,d0 ; Restore
  25766.   RTS
  25767.  
  25768. ;*************************************************************************************
  25769.  
  25770. _MTripleTile16x16ShortCheck
  25771.   BSR     _MDoubleTile32x32ShortCheck
  25772.   MOVE.w  CurrentChunkyBitmap2,d0
  25773.   BLT     Error28
  25774.   !CThreeBitmapChecks
  25775.   !GetBitmapObjectPtr ; Base in a0
  25776.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has stencil?
  25777.   BEQ     Error34
  25778.   !CCheckWindowFits2
  25779.   MOVE.w  a1,d0 ; Restore
  25780.   RTS
  25781. _MTripleTile16x16Check
  25782.   BSR     _MDoubleTile32x32Check
  25783.   MOVE.w  CurrentChunkyBitmap2,d0
  25784.   BLT     Error28
  25785.   !CThreeBitmapChecks
  25786.   !GetBitmapObjectPtr ; Base in a0
  25787.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has stencil?
  25788.   BEQ     Error34
  25789.   !CCheckWindowFits2
  25790.   MOVE.w  a1,d0 ; Restore
  25791.   RTS
  25792.  
  25793. ;*************************************************************************************
  25794.  
  25795. _MTripleTile32x32ShortCheck
  25796.   BSR     _MDoubleTile16x16ShortCheck
  25797.   MOVE.w  CurrentChunkyBitmap2,d0
  25798.   BLT     Error28
  25799.   !CThreeBitmapChecks
  25800.   !GetBitmapObjectPtr ; Base in a0
  25801.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has stencil?
  25802.   BEQ     Error34
  25803.   !CCheckWindowFits2
  25804.   MOVE.w  a1,d0 ; Restore
  25805.   RTS
  25806. _MTripleTile32x32Check
  25807.   BSR     _MDoubleTile16x16Check
  25808.   MOVE.w  CurrentChunkyBitmap2,d0
  25809.   BLT     Error28
  25810.   !CThreeBitmapChecks
  25811.   !GetBitmapObjectPtr ; Base in a0
  25812.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has stencil?
  25813.   BEQ     Error34
  25814.   !CCheckWindowFits2
  25815.   MOVE.w  a1,d0 ; Restore
  25816.   RTS
  25817.  
  25818. ;*************************************************************************************
  25819.  
  25820. _MTile16x16TwiceShortCheck
  25821.   BSR     _MDoubleTile32x32ShortCheck
  25822.   MOVE.w  CurrentChunkyBitmap2,d0
  25823.   BLT     Error28
  25824.   !CThreeBitmapChecks
  25825.   !GetBitmapObjectPtr ; Base in a0
  25826.   !CCheckWindowFits2
  25827.   MOVE.w  a1,d0 ; Restore
  25828.   RTS
  25829. _MTile16x16TwiceCheck
  25830.   BSR     _MDoubleTile32x32Check
  25831.   MOVE.w  CurrentChunkyBitmap2,d0
  25832.   BLT     Error28
  25833.   !CThreeBitmapChecks
  25834.   !GetBitmapObjectPtr ; Base in a0
  25835.   !CCheckWindowFits2
  25836.   MOVE.w  a1,d0 ; Restore
  25837.   RTS
  25838.  
  25839. ;*************************************************************************************
  25840.  
  25841. _MTile32x32TwiceShortCheck
  25842.   BSR     _MDoubleTile16x16ShortCheck
  25843.   MOVE.w  CurrentChunkyBitmap2,d0
  25844.   BLT     Error28
  25845.   !CThreeBitmapChecks
  25846.   !GetBitmapObjectPtr ; Base in a0
  25847.   !CCheckWindowFits2
  25848.   MOVE.w  a1,d0 ; Restore
  25849.   RTS
  25850. _MTile32x32TwiceCheck
  25851.   BSR     _MDoubleTile16x16Check
  25852.   MOVE.w  CurrentChunkyBitmap2,d0
  25853.   BLT     Error28
  25854.   !CThreeBitmapChecks
  25855.   !GetBitmapObjectPtr ; Base in a0
  25856.   !CCheckWindowFits2
  25857.   MOVE.w  a1,d0 ; Restore
  25858.   RTS
  25859.  
  25860. ;*************************************************************************************
  25861.  
  25862. _MReserveChunkyQueuesCheck
  25863.   !CCheckWordParam2
  25864.   RTS
  25865.  
  25866. ;*************************************************************************************
  25867.  
  25868. _MFreeChunkyQueuesRangeCheck
  25869. ;Not really feasible to check existence of every ChunkyQueue in the range
  25870.   !CCheckChunkyQueuesExist
  25871.   EXG.l   d0,d1
  25872.   !CCheckChunkyQueueNum
  25873.   EXG.l   d0,d1
  25874.   !CCheckChunkyQueueNum
  25875.   CMP.w   d0,d1
  25876.   BLT     Error56 ; First>Last
  25877.   RTS
  25878. _MFreeChunkyQueuesCheck
  25879.   !CCheckChunkyQueuesExist
  25880.   RTS
  25881. _MFreeChunkyQueueCheck
  25882.   !CThreeQueueChecks
  25883.   RTS
  25884.  
  25885. ;*************************************************************************************
  25886.  
  25887. _MAddrChunkyQueueShortCheck
  25888.   MOVE.w  CurrentChunkyQueue1,d0
  25889.   BLT     Error61
  25890. _MAddrChunkyQueueCheck
  25891.   !CThreeQueueChecks
  25892.   RTS
  25893.  
  25894. ;*************************************************************************************
  25895.  
  25896. _MChunkyQueueCheck
  25897.   !CCheckChunkyQueuesExist
  25898.   !CCheckChunkyQueueNum
  25899.   TST.w   d1
  25900.   BLE     Error60
  25901.   RTS
  25902.  
  25903. ;*************************************************************************************
  25904.  
  25905. _MFlushChunkyQueueCheck
  25906.   !CThreeQueueChecks
  25907.   RTS
  25908.  
  25909. ;*************************************************************************************
  25910.  
  25911. _MUseChunkyQueueCheck
  25912.   EXG.l   d2,d0
  25913.   !CThreeQueueChecks
  25914.   EXG.l   d2,d0
  25915. _MUseChunkyQueueShortCheck
  25916.   EXG.l   d1,d0
  25917.   !CThreeQueueChecks
  25918.   EXG.l   d1,d0
  25919. _MUseChunkyQueueShortestCheck
  25920.   !CThreeQueueChecks
  25921.   RTS
  25922.  
  25923. ;*************************************************************************************
  25924.  
  25925. _MUsedChunkyQueueCheck
  25926.   !CCheckChunkyQueuesExist
  25927.   TST.w   CurrentChunkyQueue1
  25928.   BLT     Error61 ; Not used
  25929.   RTS
  25930.  
  25931. ;*************************************************************************************
  25932.  
  25933. _MQBlitShortestCheck
  25934.   MOVE.w  d1,d3
  25935.   MOVE.w  d0,d2
  25936.   MOVE.w  CurrentChunkyShape1,d1
  25937.   BLT     Error27
  25938.   MOVE.w  CurrentChunkyQueue1,d0
  25939.   BLT     Error61
  25940.   BSR     _MQBlitCheck
  25941.   MOVE.w  d2,d0
  25942.   MOVE.w  d3,d1
  25943.   RTS
  25944. _MQBlitShortCheck
  25945.   MOVE.w  d2,d3
  25946.   MOVE.w  d1,d2
  25947.   MOVE.w  d0,d1
  25948.   MOVE.w  CurrentChunkyQueue1,d0
  25949.   BLT     Error61
  25950.   BSR     _MQBlitCheck
  25951.   MOVE.w  d1,d0
  25952.   MOVE.w  d2,d1
  25953.   MOVE.w  d3,d2
  25954.   RTS
  25955. _MQBlitCheck
  25956.   MOVE.w  d0,a1 ; Store
  25957.   EXG.l   d0,d1
  25958.   !CThreeShapeChecks
  25959.   !GetShapeObjectPtr ; Base in a0
  25960.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Source has cookie?
  25961.   BEQ     Error31
  25962.   EXG.l   d0,d1
  25963.   MOVEM.w d1/d2,-(a7) ; Store
  25964.   SUB.w   CRsrc_XHandle-ChunkyResources(a0),d1 ; Adjust Xpos
  25965.   SUB.w   CRsrc_YHandle-ChunkyResources(a0),d2 ; Adjust Ypos
  25966.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d4 ; OpWidth
  25967.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d5 ; OpHeight
  25968.   !CThreeQueueChecks
  25969.   !GetQueueObjectPtr ; Base in a0
  25970.   MOVE.w  CQueue_Items-ChunkyQueues(a0),d7
  25971.   CMP.w   CQueue_MaxItems-ChunkyQueues(a0),d7 ; Full?
  25972.   BGE     Error62
  25973.   MOVE.w  CurrentChunkyBitmap1,d0
  25974.   BLT     Error28
  25975.   !CThreeBitmapChecks
  25976.   !GetBitmapObjectPtr ; Base in a0
  25977.   !CCheckWindowFits
  25978.   MOVE.w  a1,d0 ; Restore
  25979.   MOVEM.w (a7)+,d1/d2 ; Restore
  25980.   CMP.w   #5,_QBlitModeType
  25981.   BNE     _MQBlitCheckSkip
  25982.   TST.w   CurrentChunkyTable1
  25983.   BLT     Error72
  25984. _MQBlitCheckSkip
  25985.   CMP.w   #6,_QBlitModeType
  25986.   BNE     _MQBlitCheckSkip2
  25987.   TST.w   CurrentChunkyTable1
  25988.   BLT     Error72
  25989. _MQBlitCheckSkip2
  25990.   RTS
  25991.  
  25992. ;*************************************************************************************
  25993.  
  25994. _MQBlockShortestCheck
  25995.   MOVE.w  d1,d3
  25996.   MOVE.w  d0,d2
  25997.   MOVE.w  CurrentChunkyShape1,d1
  25998.   BLT     Error27
  25999.   MOVE.w  CurrentChunkyQueue1,d0
  26000.   BLT     Error61
  26001.   BSR     _MQBlockCheck
  26002.   MOVE.w  d2,d0
  26003.   MOVE.w  d3,d1
  26004.   RTS
  26005. _MQBlockShortCheck
  26006.   MOVE.w  d2,d3
  26007.   MOVE.w  d1,d2
  26008.   MOVE.w  d0,d1
  26009.   MOVE.w  CurrentChunkyQueue1,d0
  26010.   BLT     Error61
  26011.   BSR     _MQBlockCheck
  26012.   MOVE.w  d1,d0
  26013.   MOVE.w  d2,d1
  26014.   MOVE.w  d3,d2
  26015.   RTS
  26016. _MQBlockCheck
  26017.   AND.b   #$F0,d2 ; X crop to 16 align
  26018.   MOVE.w  d0,a1 ; Store
  26019.   EXG.l   d0,d1
  26020.   !CThreeShapeChecks
  26021.   !GetShapeObjectPtr ; Base in a0
  26022.   EXG.l   d0,d1
  26023.   MOVEM.w d1/d2,-(a7) ; Store
  26024.   SUB.w   CRsrc_XHandle-ChunkyResources(a0),d1 ; Adjust Xpos
  26025.   SUB.w   CRsrc_YHandle-ChunkyResources(a0),d2 ; Adjust Ypos
  26026.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d4 ; OpWidth
  26027.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d5 ; OpHeight
  26028.   MOVE.w  d4,d6 ; Copy width
  26029.   AND.b   #$0F,d6 ; Aligned width?
  26030.   BNE     Error55
  26031.   !CThreeQueueChecks
  26032.   !GetQueueObjectPtr ; Base in a0
  26033.   MOVE.w  CQueue_Items-ChunkyQueues(a0),d7
  26034.   CMP.w   CQueue_MaxItems-ChunkyQueues(a0),d7 ; Full?
  26035.   BGE     Error62
  26036.   MOVE.w  CurrentChunkyBitmap1,d0
  26037.   BLT     Error28
  26038.   !CThreeBitmapChecks
  26039.   !GetBitmapObjectPtr ; Base in a0
  26040.   !CCheckWindowFits
  26041.   MOVE.w  a1,d0 ; Restore
  26042.   MOVEM.w (a7)+,d1/d2 ; Restore
  26043.   RTS
  26044.  
  26045. ;*************************************************************************************
  26046.  
  26047. _MBlockUnQueueRangeShortCheck ; piggyback
  26048. _MUnQueueRangeShortCheck
  26049.   !CThreeQueueChecks
  26050.   !GetQueueObjectPtr ; Base in a0
  26051.   MOVE.w  CQueue_Items-ChunkyQueues(a0),d7 ; Has items to unqueue?
  26052.   BLE     Error63
  26053.   CMP.w   d1,d7 ; First>Total?
  26054.   BLE     Error58
  26055.   TST.w   d1
  26056.   BLT     Error58
  26057.   CMP.w   d2,d7 ; Last>Total?
  26058.   BLE     Error58
  26059.   TST.w   d2
  26060.   BLT     Error58
  26061.   CMP.w   d1,d2 ; First>Last?
  26062.   BLT     Error66
  26063.   RTS
  26064. _MBlockUnQueueShortCheck ; piggyback
  26065. _MUnQueueShortCheck
  26066.   !CThreeQueueChecks
  26067.   !GetQueueObjectPtr ; Base in a0
  26068.   TST.w   CQueue_Items-ChunkyQueues(a0) ; Has items to unqueue?
  26069.   BLE     Error63
  26070.   RTS
  26071. _MBlockUnQueueRangeCheck ; piggyback
  26072. _MUnQueueRangeCheck
  26073.   !CThreeQueueChecks
  26074.   !GetQueueObjectPtr ; Base in a0
  26075.   MOVE.w  CQueue_Items-ChunkyQueues(a0),d7 ; Has items to unqueue?
  26076.   BLE     Error63
  26077.   EXG.l   d0,d3
  26078.   !CThreeBitmapChecks
  26079.   EXG.l   d0,d3
  26080.   BLE     Error63
  26081.   CMP.w   d1,d7 ; First>Total?
  26082.   BLE     Error58
  26083.   TST.w   d1
  26084.   BLT     Error58
  26085.   CMP.w   d2,d7 ; Last>Total?
  26086.   BLE     Error58
  26087.   TST.w   d2
  26088.   BLT     Error58
  26089.   CMP.w   d1,d2 ; First>Last?
  26090.   BLT     Error66
  26091.   RTS
  26092. _MBlockUnQueueCheck ; piggyback
  26093. _MUnQueueCheck
  26094.   !CThreeQueueChecks
  26095.   !GetQueueObjectPtr ; Base in a0
  26096.   TST.w   CQueue_Items-ChunkyQueues(a0) ; Has items to unqueue?
  26097.   BLE     Error63
  26098.   EXG.l   d0,d1
  26099.   !CThreeBitmapChecks
  26100.   EXG.l   d0,d1
  26101.   RTS
  26102.  
  26103. ;*************************************************************************************
  26104.  
  26105. _MBitmapPtrAssumeCheck
  26106.   MOVE.w  CurrentChunkyBitmap1,d0
  26107.   BLT     Error28
  26108. _MBitmapPtrShortestCheck
  26109.   !CThreeBitmapChecks
  26110.   RTS
  26111. _MBitmapPtrShortCheck
  26112.   MOVE.w  d0,d2
  26113.   MOVE.w  CurrentChunkyBitmap1,d0
  26114.   BLT     Error28
  26115.   MOVE.w  d2,d0
  26116.   RTS
  26117. _MBitmapPtrCheck
  26118.   EXG.l   d0,d2
  26119.   !CThreeBitmapChecks
  26120.   EXG.l   d0,d2
  26121.   RTS
  26122.  
  26123. ;*************************************************************************************
  26124.  
  26125. _MShapePtrAssumeCheck
  26126.   MOVE.w  CurrentChunkyShape1,d0
  26127.   BLT     Error27
  26128. _MShapePtrShortestCheck
  26129.   !CThreeShapeChecks
  26130.   RTS
  26131. _MShapePtrShortCheck
  26132.   MOVE.w  d0,d2
  26133.   MOVE.w  CurrentChunkyShape1,d0
  26134.   BLT     Error27
  26135.   MOVE.w  d2,d0
  26136.   RTS
  26137. _MShapePtrCheck
  26138.   EXG.l   d0,d2
  26139.   !CThreeShapeChecks
  26140.   EXG.l   d0,d2
  26141.   RTS
  26142.  
  26143. ;*************************************************************************************
  26144.  
  26145. _MStencilPtrAssumeCheck
  26146.   MOVE.w  CurrentChunkyBitmap1,d0
  26147.   BLT     Error28
  26148. _MStencilPtrShortestCheck
  26149.   !CThreeBitmapChecks
  26150.   !GetBitmapObjectPtr ; base in a0
  26151.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has stencil?
  26152.   BEQ     Error46
  26153.   RTS
  26154. _MStencilPtrShortCheck
  26155.   MOVE.w  d0,d2
  26156.   MOVE.w  CurrentChunkyBitmap1,d0
  26157.   BLT     Error28
  26158.   !GetBitmapObjectPtr ; base in a0
  26159.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has stencil?
  26160.   BEQ     Error46
  26161.   MOVE.w  d2,d0
  26162.   RTS
  26163. _MStencilPtrCheck
  26164.   EXG.l   d0,d2
  26165.   !CThreeBitmapChecks
  26166.   !GetBitmapObjectPtr ; base in a0
  26167.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has stencil?
  26168.   BEQ     Error46
  26169.   EXG.l   d0,d2
  26170.   RTS
  26171.  
  26172. ;*************************************************************************************
  26173.  
  26174. _MCookiePtrAssumeCheck
  26175.   MOVE.w  CurrentChunkyShape1,d0
  26176.   BLT     Error27
  26177. _MCookiePtrShortestCheck
  26178.   !CThreeShapeChecks
  26179.   !GetShapeObjectPtr ; base in a0
  26180.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has cookie?
  26181.   BEQ     Error45
  26182.   RTS
  26183. _MCookiePtrShortCheck
  26184.   MOVE.w  d0,d2
  26185.   MOVE.w  CurrentChunkyShape1,d0
  26186.   BLT     Error27
  26187.   !GetShapeObjectPtr ; base in a0
  26188.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has cookie?
  26189.   BEQ     Error45
  26190.   MOVE.w  d2,d0
  26191.   RTS
  26192. _MCookiePtrCheck
  26193.   EXG.l   d0,d2
  26194.   !CThreeShapeChecks
  26195.   !GetShapeObjectPtr ; base in a0
  26196.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has cookie?
  26197.   BEQ     Error45
  26198.   EXG.l   d0,d2
  26199.   RTS
  26200.  
  26201. ;*************************************************************************************
  26202.  
  26203. _MQDummyShortCheck
  26204.   MOVE.w  d3,d4
  26205.   MOVE.w  d2,d3
  26206.   MOVE.w  d1,d2
  26207.   MOVE.w  d0,d1
  26208.   MOVE.w  CurrentChunkyQueue1,d0
  26209.   BLT     Error61
  26210.   BSR     _MQDummyCheck
  26211.   MOVE.w  d1,d0
  26212.   MOVE.w  d2,d1
  26213.   MOVE.w  d3,d2
  26214.   MOVE.w  d4,d3
  26215.   RTS
  26216. _MQDummyCheck
  26217.   !CThreeQueueChecks
  26218.   !GetQueueObjectPtr ; Base in a0
  26219.   MOVE.w  CQueue_Items-ChunkyQueues(a0),d7
  26220.   CMP.w   CQueue_MaxItems-ChunkyQueues(a0),d7 ; Full?
  26221.   BGE     Error62
  26222.   MOVE.w  d0,a1 ; Store
  26223.   MOVE.w  CurrentChunkyBitmap1,d0
  26224.   BLT     Error28
  26225.   !CThreeBitmapChecks
  26226.   !GetBitmapObjectPtr ; Base in a0
  26227.   !CCheckWindowFits2
  26228.   MOVE.w  a1,d0 ; Restore
  26229.   RTS
  26230.  
  26231. ;*************************************************************************************
  26232.  
  26233. _MDoubleBlitShortCheck
  26234.   MOVE.w  d1,d2
  26235.   MOVE.w  d0,d1
  26236.   MOVE.w  CurrentChunkyShape1,d0
  26237.   BLT     Error27
  26238.   BSR     _MDoubleBlitCheck
  26239.   MOVE.w  d1,d0
  26240.   MOVE.w  d2,d1
  26241.   RTS
  26242. _MDoubleBlitCheck
  26243.   !CThreeShapeChecks
  26244.   !GetShapeObjectPtr ; Base in a0
  26245.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Source has cookie?
  26246.   BEQ     Error31
  26247.   MOVEM.w d1/d2,-(a7) ; Store
  26248.   SUB.w   CRsrc_XHandle-ChunkyResources(a0),d1 ; Adjust Xpos
  26249.   SUB.w   CRsrc_YHandle-ChunkyResources(a0),d2 ; Adjust Ypos
  26250.   MOVE.w  d0,a1 ; Store
  26251.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d3 ; OpWidth
  26252.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d4 ; OpHeight
  26253.   MOVE.w  CurrentChunkyBitmap1,d0
  26254.   BLT     Error28
  26255.   !CThreeBitmapChecks
  26256.   !GetBitmapObjectPtr ; Base in a0
  26257.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Dest has stencil?
  26258.   BEQ     Error34
  26259.   !CCheckWindowFits2
  26260.   MOVE.w  a1,d0 ; Restore
  26261.   MOVEM.w (a7)+,d1/d2 ; Restore
  26262.   CMP.w   #5,_DoubleBlitModeType
  26263.   BNE     _MDoubleBlitCheckSkip
  26264.   TST.w   CurrentChunkyTable1
  26265.   BLT     Error72
  26266. _MDoubleBlitCheckSkip
  26267.   CMP.w   #6,_DoubleBlitModeType
  26268.   BNE     _MDoubleBlitCheckSkip2
  26269.   TST.w   CurrentChunkyTable1
  26270.   BLT     Error72
  26271. _MDoubleBlitCheckSkip2
  26272.   RTS
  26273.  
  26274. ;*************************************************************************************
  26275.  
  26276. _MDoubleBlockShortCheck
  26277.   MOVE.w  d1,d2
  26278.   MOVE.w  d0,d1
  26279.   MOVE.w  CurrentChunkyShape1,d0
  26280.   BLT     Error27
  26281.   BSR     _MDoubleBlockCheck
  26282.   MOVE.w  d1,d0
  26283.   MOVE.w  d2,d1
  26284.   RTS
  26285. _MDoubleBlockCheck
  26286.   MOVE.w  d0,a1 ; Store
  26287.   !CThreeShapeChecks
  26288.   !GetShapeObjectPtr ; Base in a0
  26289.   MOVEM.w d1/d2,-(a7) ; Store
  26290.   SUB.w   CRsrc_XHandle-ChunkyResources(a0),d1 ; Adjust Xpos
  26291.   SUB.w   CRsrc_YHandle-ChunkyResources(a0),d2 ; Adjust Ypos
  26292.   AND.b   #$F0,d1 ; X crop to 16 align
  26293.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d3 ; OpWidth
  26294.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d4 ; OpHeight
  26295.   MOVE.w  d3,d5 ; Copy width
  26296.   AND.b   #$0F,d5 ; Aligned width?
  26297.   BNE     Error55
  26298.   MOVE.w  CurrentChunkyBitmap1,d0
  26299.   BLT     Error28
  26300.   !CThreeBitmapChecks
  26301.   !GetBitmapObjectPtr ; Base in a0
  26302.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Dest has stencil?
  26303.   BEQ     Error34
  26304.   !CCheckWindowFits2
  26305.   MOVE.w  a1,d0 ; Restore
  26306.   MOVEM.w (a7)+,d1/d2 ; Restore
  26307.   RTS
  26308.  
  26309. ;*************************************************************************************
  26310.  
  26311. _MDoubleQBlitShortestCheck
  26312.   BSR     _MQBlitShortestCheck
  26313.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has stencil?
  26314.   BEQ     Error34
  26315.   RTS
  26316. _MDoubleQBlitShortCheck
  26317.   BSR     _MQBlitShortCheck
  26318.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has stencil?
  26319.   BEQ     Error34
  26320.   RTS
  26321. _MDoubleQBlitCheck
  26322.   BSR     _MQBlitCheck
  26323.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has stencil?
  26324.   BEQ     Error34
  26325.   RTS
  26326.  
  26327. ;*************************************************************************************
  26328.  
  26329. _MDoubleQBlockShortestCheck
  26330.   BSR     _MQBlockShortestCheck
  26331.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has stencil?
  26332.   BEQ     Error34
  26333.   RTS
  26334. _MDoubleQBlockShortCheck
  26335.   BSR     _MQBlockShortCheck
  26336.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has stencil?
  26337.   BEQ     Error34
  26338.   RTS
  26339. _MDoubleQBlockCheck
  26340.   BSR     _MQBlockCheck
  26341.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has stencil?
  26342.   BEQ     Error34
  26343.   RTS
  26344.  
  26345. ;*************************************************************************************
  26346.  
  26347. _MBoxFShortCheck
  26348. _MBoxFCheck
  26349. _MBoxShortCheck ; Piggyback
  26350. _MBoxCheck ; Piggyback
  26351.   MOVE.w  _DrawingModeType,d7
  26352.   CMP.w   #4,d7
  26353.   BLE     _MBoxFCheckSkip
  26354.   CMP.w   #7,d7
  26355.   BGE     _MBoxFCheckSkip
  26356.   TST.w   CurrentChunkyTable1
  26357.   BLT     Error72
  26358. _MBoxFCheckSkip
  26359.   MOVE.w  CurrentChunkyBitmap1,d6
  26360.   BLT     Error28
  26361.   EXG.l   d6,d0
  26362.   !CThreeBitmapChecks
  26363.   !GetBitmapObjectPtr ; Base in a0
  26364.   EXG.l   d6,d0
  26365.   !CCheckWindowFits4
  26366.   RTS
  26367.  
  26368. ;*************************************************************************************
  26369.  
  26370. _MBoxFShapeShortCheck
  26371. _MBoxFShapeCheck
  26372. _MBoxShapeShortCheck ; Piggyback
  26373. _MBoxShapeCheck ; Piggyback
  26374.   MOVE.w  _DrawingModeType,d7
  26375.   CMP.w   #4,d7
  26376.   BLE     _MBoxFShapeCheckSkip
  26377.   CMP.w   #7,d7
  26378.   BGE     _MBoxFShapeCheckSkip
  26379.   TST.w   CurrentChunkyTable1
  26380.   BLT     Error72
  26381. _MBoxFShapeCheckSkip
  26382.   MOVE.w  CurrentChunkyShape1,d6
  26383.   BLT     Error27
  26384.   EXG.l   d6,d0
  26385.   !CThreeShapeChecks
  26386.   !GetShapeObjectPtr ; Base in a0
  26387.   EXG.l   d6,d0
  26388.   !CCheckWindowFits4
  26389.   RTS
  26390.  
  26391. ;*************************************************************************************
  26392.  
  26393. _MBoxStencilShortCheck ; Piggyback
  26394. _MBoxStencilCheck ; Piggyback
  26395. _MBoxFStencilShortCheck
  26396. _MBoxFStencilCheck
  26397.   MOVE.w  CurrentChunkyBitmap1,d6
  26398.   BLT     Error28
  26399.   EXG.l   d6,d0
  26400.   !CThreeBitmapChecks
  26401.   !GetBitmapObjectPtr ; Base in a0
  26402.   EXG.l   d6,d0
  26403.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has stencil?
  26404.   BEQ     Error46
  26405.   !CCheckWindowFits4
  26406.   RTS
  26407.  
  26408. ;*************************************************************************************
  26409.  
  26410. _MBoxCookieShortCheck ; Piggyback
  26411. _MBoxCookieCheck ; Piggyback
  26412. _MBoxFCookieShortCheck
  26413. _MBoxFCookieCheck
  26414.   MOVE.w  CurrentChunkyShape1,d6
  26415.   BLT     Error27
  26416.   EXG.l   d6,d0
  26417.   !CThreeShapeChecks
  26418.   !GetShapeObjectPtr ; Base in a0
  26419.   EXG.l   d6,d0
  26420.   TST.l   CRsrc_SMem-ChunkyResources(a0) ; Has cookie?
  26421.   BEQ     Error45
  26422.   !CCheckWindowFits4
  26423.   RTS
  26424.  
  26425. ;*************************************************************************************
  26426.  
  26427. _MPlanar16ToBitmapShortCheck
  26428.   !CThreeBitmapChecks
  26429.   !GetBitmapObjectPtr ; Base in a0
  26430.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d2 ; OpWidth
  26431.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d3 ; OpHeight
  26432.   MOVE.w  d2,d4 ; PlanarWidth
  26433.   MOVE.w  d3,d5 ; PlanarHeight
  26434. _MPlanar16ToBitmapCheck
  26435.   !CThreeBitmapChecks
  26436.   !GetBitmapObjectPtr
  26437.   MOVE.l  d0,a1 ; Store
  26438.   MOVE.l  d1,a2 ; Store
  26439.   MOVEQ.l #0,d0 ; X1
  26440.   MOVEQ.l #0,d1 ; Y1
  26441.   AND.b   #$F0,d2
  26442.   AND.b   #$F0,d4
  26443.   !CCheckWindowFits3
  26444.   MOVE.l  a2,d1 ; Restore
  26445.   BEQ     Error2
  26446.   MOVE.l  a1,d0 ; Restore
  26447.   RTS
  26448.  
  26449. ;*************************************************************************************
  26450.  
  26451. _MPlanar16ToShapeShortCheck
  26452.   !CThreeShapeChecks
  26453.   !GetShapeObjectPtr ; Base in a0
  26454.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d2 ; OpWidth
  26455.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d3 ; OpHeight
  26456.   MOVE.w  d2,d4 ; PlanarWidth
  26457.   MOVE.w  d3,d5 ; PlanarHeight
  26458. _MPlanar16ToShapeCheck
  26459.   !CThreeShapeChecks
  26460.   !GetShapeObjectPtr
  26461.   MOVE.l  d0,a1 ; Store
  26462.   MOVE.l  d1,a2 ; Store
  26463.   MOVEQ.l #0,d0 ; X1
  26464.   MOVEQ.l #0,d1 ; Y1
  26465.   AND.b   #$F0,d2
  26466.   AND.b   #$F0,d4
  26467.   !CCheckWindowFits3
  26468.   MOVE.l  a2,d1 ; Restore
  26469.   BEQ     Error2
  26470.   MOVE.l  a1,d0 ; Restore
  26471.   RTS
  26472.  
  26473. ;*************************************************************************************
  26474.  
  26475. _MGenericPtrCheck
  26476.   TST.w   d3 ; Width okay?
  26477.   BLE     Error64
  26478.   TST.l   d2 ; Address likely?
  26479.   BEQ     Error65
  26480.   ;Allow xpos,ypos to be negative
  26481.   RTS
  26482.  
  26483. ;*************************************************************************************
  26484.  
  26485. _MCludgeCookieCheck
  26486.   !CThreeShapeChecks
  26487.   TST.l   d1 ; Test mem address
  26488.   BEQ     Error65
  26489.   RTS
  26490.  
  26491. ;*************************************************************************************
  26492.  
  26493. _MCludgeStencilCheck
  26494.   !CThreeBitmapChecks
  26495.   TST.l   d1 ; Test mem address
  26496.   BEQ     Error65
  26497.   RTS
  26498.  
  26499. ;*************************************************************************************
  26500.  
  26501. _MReMapShortestCheck
  26502.   MOVE.w  CurrentChunkyBitmap1,d1
  26503.   BLT     Error28
  26504. _MReMapShortCheck
  26505.   EXG.l   d0,d1
  26506.   !CThreeBitmapChecks
  26507.   EXG.l   d0,d1
  26508.   TST.l   d0
  26509.   BEQ     Error65
  26510.   RTS
  26511. _MReMapCheck
  26512.   EXG.l   d0,d2
  26513.   !CThreeBitmapChecks
  26514.   EXG.l   d0,d2
  26515.   RTS
  26516.  
  26517. ;*************************************************************************************
  26518.  
  26519. _MReMapShapeShortestCheck
  26520.   MOVE.w  CurrentChunkyShape1,d1
  26521.   BLT     Error27
  26522. _MReMapShapeShortCheck
  26523.   EXG.l   d0,d1
  26524.   !CThreeShapeChecks
  26525.   EXG.l   d0,d1
  26526.   TST.l   d0
  26527.   BEQ     Error65
  26528.   RTS
  26529. _MReMapShapeCheck
  26530.   EXG.l   d0,d2
  26531.   !CThreeShapeChecks
  26532.   EXG.l   d0,d2
  26533.   RTS
  26534.  
  26535. ;*************************************************************************************
  26536.  
  26537. _MLineShortest2Check
  26538.   MOVEQ.l #0,d4 ; Colour 0
  26539. _MLineShortestCheck
  26540.   MOVE.w  _DrawingModeType,d7
  26541.   CMP.w   #4,d7
  26542.   BLE     _MLineCheckSkip
  26543.   TST.w   CurrentChunkyTable1
  26544.   BLT     Error72
  26545. _MLineCheckSkip
  26546.   MOVE.w  d1,d3 ; Xpos2
  26547.   MOVE.w  d0,d2 ; Ypos2
  26548.   MOVE.w  LineLastXpos,d0
  26549.   MOVE.w  LineLastYpos,d1
  26550.   MOVE.w  CurrentChunkyBitmap1,d6
  26551.   BSR     _MLineCheck
  26552.   MOVE.w  d2,d0
  26553.   MOVE.w  d3,d1
  26554.   RTS
  26555. _MLineShortCheck
  26556.   MOVEQ.l #0,d4 ; Colour 0
  26557. _MLineCheck
  26558.   MOVE.w  CurrentChunkyBitmap1,d6
  26559.   BLT     Error28
  26560.   EXG.l   d6,d0
  26561.   !CThreeBitmapChecks
  26562.   !GetBitmapObjectPtr ; Base in a0
  26563.   EXG.l   d6,d0
  26564.   !CCheckWindowFits4
  26565.   RTS
  26566.  
  26567. ;*************************************************************************************
  26568.  
  26569. _MLineShapeShortest2Check
  26570.   MOVEQ.l #0,d4 ; Colour 0
  26571. _MLineShapeShortestCheck
  26572.   MOVE.w  _DrawingModeType,d7
  26573.   CMP.w   #4,d7
  26574.   BLE     _MLineShapeCheckSkip
  26575.   TST.w   CurrentChunkyTable1
  26576.   BLT     Error72
  26577. _MLineShapeCheckSkip
  26578.   MOVE.w  d1,d3 ; Xpos2
  26579.   MOVE.w  d0,d2 ; Ypos2
  26580.   MOVE.w  LineLastXpos,d0
  26581.   MOVE.w  LineLastYpos,d1
  26582.   BSR     _MLineShapeCheck
  26583.   MOVE.w  d2,d0
  26584.   MOVE.w  d3,d1
  26585.   RTS
  26586. _MLineShapeShortCheck
  26587.   MOVEQ.l #0,d4 ; Colour 0
  26588. _MLineShapeCheck
  26589.   MOVE.w  CurrentChunkyShape1,d6
  26590.   BLT     Error28
  26591.   EXG.l   d6,d0
  26592.   !CThreeShapeChecks
  26593.   !GetShapeObjectPtr ; Base in a0
  26594.   EXG.l   d6,d0
  26595.   !CCheckWindowFits4
  26596.   RTS
  26597.  
  26598. ;*************************************************************************************
  26599.  
  26600. _MLineStencilShortest2Check
  26601.   MOVEQ.l #0,d4 ; Colour 0
  26602. _MLineStencilShortestCheck
  26603.   MOVE.w  d1,d3 ; Xpos2
  26604.   MOVE.w  d0,d2 ; Ypos2
  26605.   MOVE.w  LineLastXpos,d0
  26606.   MOVE.w  LineLastYpos,d1
  26607.   MOVE.w  CurrentChunkyBitmap1,d6
  26608.   BSR     _MLineStencilCheck
  26609.   MOVE.w  d2,d0
  26610.   MOVE.w  d3,d1
  26611.   RTS
  26612. _MLineStencilShortCheck
  26613.   MOVEQ.l #0,d4 ; Colour 0
  26614. _MLineStencilCheck
  26615.   MOVE.w  CurrentChunkyBitmap1,d6
  26616.   BLT     Error28
  26617.   EXG.l   d6,d0
  26618.   !CThreeBitmapChecks
  26619.   !GetBitmapObjectPtr ; Base in a0
  26620.   TST.l   CRsrc_Stencil-ChunkyResources(a0) ; Has stencil?
  26621.   BEQ     Error34
  26622.   EXG.l   d6,d0
  26623.   !CCheckWindowFits4
  26624.   RTS
  26625.  
  26626. ;*************************************************************************************
  26627.  
  26628. _MLineCookieShortest2Check
  26629.   MOVEQ.l #0,d4 ; Colour 0
  26630. _MLineCookieShortestCheck
  26631.   MOVE.w  d1,d3 ; Xpos2
  26632.   MOVE.w  d0,d2 ; Ypos2
  26633.   MOVE.w  LineLastXpos,d0
  26634.   MOVE.w  LineLastYpos,d1
  26635.   BSR     _MLineCookieCheck
  26636.   MOVE.w  d2,d0
  26637.   MOVE.w  d3,d1
  26638.   RTS
  26639. _MLineCookieShortCheck
  26640.   MOVEQ.l #0,d4 ; Colour 0
  26641. _MLineCookieCheck
  26642.   MOVE.w  CurrentChunkyShape1,d6
  26643.   BLT     Error28
  26644.   EXG.l   d6,d0
  26645.   !CThreeShapeChecks
  26646.   !GetShapeObjectPtr ; Base in a0
  26647.   TST.l   CRsrc_Stencil-ChunkyResources(a0) ; Has cookie?
  26648.   BEQ     Error32
  26649.   EXG.l   d6,d0
  26650.   !CCheckWindowFits4
  26651.   RTS
  26652.  
  26653. ;*************************************************************************************
  26654.  
  26655. _MInkShortestCheck
  26656.   AND.w   #$00FF,d2
  26657.   TST.w   d2
  26658.   BLT     Error71
  26659.   CMP.w   #255,d2
  26660.   BGT     Error71
  26661. _MInkShortCheck
  26662.   AND.w   #$00FF,d1
  26663.   TST.w   d1
  26664.   BLT     Error71
  26665.   CMP.w   #255,d1
  26666.   BGT     Error71
  26667. _MInkCheck
  26668.   AND.w   #$00FF,d0
  26669.   TST.w   d0
  26670.   BLT     Error71
  26671.   CMP.w   #255,d0
  26672.   BGT     Error71
  26673.   RTS
  26674.  
  26675. ;*************************************************************************************
  26676.  
  26677. _MReserveChunkyTablesCheck
  26678.   !CCheckWordParam2
  26679.   RTS
  26680.  
  26681. ;*************************************************************************************
  26682.  
  26683. _MFreeChunkyTablesRangeCheck
  26684. ;Not really feasible to check existence of every ChunkyTable in the range
  26685.   !CCheckChunkyTablesExist
  26686.   EXG.l   d0,d1
  26687.   !CCheckChunkyTableNum
  26688.   EXG.l   d0,d1
  26689.   !CCheckChunkyTableNum
  26690.   CMP.w   d0,d1
  26691.   BLT     Error56 ; First>Last
  26692.   RTS
  26693. _MFreeChunkyTablesCheck
  26694.   !CCheckChunkyTablesExist
  26695.   RTS
  26696. _MFreeChunkyTableCheck
  26697.   !CThreeTableChecks
  26698.   RTS
  26699.  
  26700. ;*************************************************************************************
  26701.  
  26702. _MAddrChunkyTableShortCheck
  26703.   MOVE.w  CurrentChunkyTable1,d0
  26704.   BLT     Error27
  26705. _MAddrChunkyTableCheck
  26706.   !CThreeTableChecks
  26707.   RTS
  26708.  
  26709. ;*************************************************************************************
  26710.  
  26711. _MChunkyTableCheck
  26712.   !CCheckChunkyTablesExist
  26713.   !CCheckChunkyTableNum
  26714.   TST.l   d1
  26715.   BLE     Error25
  26716.   RTS
  26717.  
  26718. ;*************************************************************************************
  26719.  
  26720. _MUseChunkyTableCheck
  26721.   EXG.l   d2,d0
  26722.   !CThreeTableChecks
  26723.   EXG.l   d2,d0
  26724. _MUseChunkyTableShortCheck
  26725.   EXG.l   d1,d0
  26726.   !CThreeTableChecks
  26727.   EXG.l   d1,d0
  26728. _MUseChunkyTableShortestCheck
  26729.   !CThreeTableChecks
  26730.   RTS
  26731.  
  26732. ;*************************************************************************************
  26733.  
  26734. _MUsedChunkyTableCheck
  26735.   !CCheckChunkyTablesExist
  26736.   TST.w   CurrentChunkyTable1
  26737.   BLT     Error72 ; Not used
  26738.   RTS
  26739.  
  26740. ;*************************************************************************************
  26741.  
  26742. _MTablePtrShortCheck
  26743.   MOVE.w  CurrentChunkyTable1,d0
  26744. _MTablePtrCheck
  26745.   !CThreeTableChecks
  26746.   RTS
  26747.  
  26748. ;*************************************************************************************
  26749.  
  26750. _MPlotParticlesCheck
  26751.   CMP.w   #4,_ParticleModeType
  26752.   BEQ     _MWrapParticlesCheck
  26753.   CMP.w   #7,_ParticleModeType
  26754.   BEQ     _MWrapParticlesCheck
  26755.   TST.w   CurrentChunkyTable1
  26756.   BLT     Error72
  26757. _MWrapYParticlesCheck ; Piggyback
  26758. _MWrapXParticlesCheck ; Piggyback
  26759. _MAddXYToParticlesQCheck ; Piggyback
  26760. _MAddXYToParticlesACheck ; Piggyback
  26761. _MAddXYToParticlesCheck ; Piggyback
  26762. _MWrapParticlesCheck ; Piggyback
  26763.   TST.w   CurrentChunkyBitmap1
  26764.   BLT     Error28
  26765.   TST.l   d0
  26766.   BEQ     Error65 ; No zero address
  26767.   TST.l   d1
  26768.   BEQ     Error76 ; Some pixels!
  26769.   RTS
  26770.  
  26771. ;*************************************************************************************
  26772.  
  26773. _MAddToXParticlesCheck ; Piggyback
  26774. _MAddToYParticlesCheck ; Piggyback
  26775. _MAddToParticlesCheck ; Piggyback
  26776.   TST.l   d3
  26777.   BEQ     Error65 ; No zero address for second increment list
  26778.   BRA     _MGrabParticlesCheck
  26779. _MGrabParticlesAndPlotCheck ; Piggyback
  26780. _MDrawParticlesCheck ; Piggyback
  26781.   CMP.w   #4,_ParticleModeType
  26782.   BEQ     _MGrabParticlesCheck
  26783.   CMP.w   #7,_ParticleModeType
  26784.   BEQ     _MGrabParticlesCheck
  26785.   TST.w   CurrentChunkyTable1
  26786.   BLT     Error72
  26787. _MReboundParticlesCheck ; Piggyback
  26788. _MAddToXParticlesShortCheck ; Piggyback
  26789. _MAddToYParticlesShortCheck ; Piggyback
  26790. _MAddToParticlesShortCheck ; Piggyback
  26791. _MGrabParticlesCheck
  26792.   TST.w   CurrentChunkyBitmap1
  26793.   BLT     Error28
  26794.   TST.l   d0
  26795.   BEQ     Error65 ; No zero address for list
  26796.   TST.l   d1
  26797.   BEQ     Error76 ; Some pixels!
  26798.   TST.l   d2
  26799.   BEQ     Error65 ; No zero address for first increment list
  26800.   RTS
  26801.  
  26802. ;*************************************************************************************
  26803.  
  26804. _MParticleModeCheck
  26805.   CMP.w   #7,d0 ; Direct?
  26806.   BGT     Error53 ; Too high
  26807.   CMP.w   #4,d0
  26808.   BLT     Error53 ; Too low
  26809.   RTS
  26810.  
  26811. ;*************************************************************************************
  26812.  
  26813. _MDrawingModeCheck
  26814.   CMP.w   #8,d0 ; Direct?
  26815.   BGE     _MDrawingModeCheckSkip
  26816.   TST.w   d0
  26817.   BLT     Error54 ; Negative mode number not allowed
  26818.   BEQ     Error53
  26819.   CMP.w   #1,d0
  26820.   BEQ     Error53
  26821.   CMP.w   #3,d0
  26822.   BEQ     Error53
  26823.   RTS
  26824. _MDrawingModeCheckSkip
  26825.   CMP.w   #_CookieMode,d0
  26826.   BEQ     Error53
  26827.   CMP.w   #_EraseMode,d0
  26828.   BEQ     Error53
  26829.   CMP.w   #_InvMode,d0
  26830.   BEQ     _MDrawingModeCheckDone
  26831.   CMP.w   #_SolidMode,d0
  26832.   BEQ     Error53
  26833.   BRA     Error53 ; None of the correct modes, so fail
  26834. _MDrawingModeCheckDone
  26835.   RTS
  26836.  
  26837. ;*************************************************************************************
  26838.  
  26839. _MPictureDissolveOutCheck
  26840.   !CThreeBitmapChecks
  26841.   MOVE.l  d0,d4 ; Store
  26842.   MOVE.w  CurrentChunkyBitmap1,d0
  26843.   BLT     Error47
  26844.   !CThreeBitmapChecks
  26845.   !GetBitmapObjectPtr ; Base of dest in a1
  26846.   MOVE.l  a0,a1
  26847.   MOVE.l  d4,d0 ; Restore
  26848.   !GetBitmapObjectPtr ; Base of pic in a0
  26849.   TST.b   CRsrc_Clipping-ChunkyResources(a1) ; Dest clip?
  26850.   BEQ     _MPictureDissolveOutCheckNoClip
  26851.   MOVE.w  CRsrc_ClipWidth-ChunkyResources(a0),d7
  26852.   CMP.w   CRsrc_ClipWidth-ChunkyResources(a1),d7 ; Same?
  26853.   BNE     Error49 ; Pic has different sized clip area
  26854.   MOVE.w  CRsrc_ClipHight-ChunkyResources(a0),d7
  26855.   CMP.w   CRsrc_ClipHight-ChunkyResources(a1),d7 ; Same?
  26856.   BNE     Error49 ; Pic has different sized clip area
  26857.   RTS
  26858. _MPictureDissolveOutCheckNoClip
  26859.   MOVE.w  CRsrc_Width-ChunkyResources(a0),d7
  26860.   CMP.w   CRsrc_Width-ChunkyResources(a1),d7 ; Same?
  26861.   BNE     Error51 ; Pic has different size
  26862.   MOVE.w  CRsrc_Height-ChunkyResources(a0),d7
  26863.   CMP.w   CRsrc_Height-ChunkyResources(a1),d7 ; Same?
  26864.   BNE     Error51 ; Pic has different size
  26865.   RTS
  26866.  
  26867. ;*************************************************************************************
  26868.  
  26869. _MZoomCustomCheck
  26870.   MOVE.l  d0,-(a7) ; Store
  26871.   MOVE.l  d0,d6 ; Store
  26872.   MOVE.l  d1,d7 ; Store
  26873.   SWAP    d6
  26874.   SWAP    d7
  26875.   MOVE.w  -8(a2),d0
  26876.   !CThreeBitmapChecks
  26877.   !GetBitmapObjectPtr ; Source Base in a0
  26878.   !CCheckXYFits2
  26879.   MOVE.w  CurrentChunkyBitmap1,d0
  26880.   BLT     Error28
  26881.   !GetBitmapObjectPtr ; Dest Base in a0
  26882.   TST.w  -2(a2)
  26883.   BLE     Error77
  26884.   TST.w  -4(a2)
  26885.   BLE     Error78
  26886.   !CCheckXYFits3
  26887.   MOVE.l  (a7)+,d0 ; Restore
  26888.   RTS
  26889. _MZoomShortCheck
  26890.   MOVEM.l d0-d3,-(a7) ; Store
  26891.   MOVE.l  d0,d6 ; Store
  26892.   MOVE.l  d1,d7 ; Store
  26893.   SWAP    d6
  26894.   SWAP    d7
  26895.   MOVE.w   CurrentChunkyBitmap1,d0
  26896.   BLT     Error28
  26897.   BRA     _MZoomSkip
  26898. _MZoomCheck
  26899.   MOVEM.l d0-d3,-(a7) ; Store
  26900.   MOVE.l  d0,d6 ; Store
  26901.   MOVE.l  d1,d7 ; Store
  26902.   SWAP    d6
  26903.   SWAP    d7
  26904.   MOVE.w  -8(a2),d0
  26905.   !CThreeBitmapChecks
  26906. _MZoomSkip
  26907.   !GetBitmapObjectPtr ; Source Base in a0
  26908.   !CCheckXYFits2
  26909.   MOVE.w  CurrentChunkyBitmap1,d0
  26910.   BLT     Error28
  26911.   !GetBitmapObjectPtr ; Dest Base in a0
  26912.   MOVE.w  d4,d0
  26913.   MOVE.w  d5,d1
  26914.   MOVE.w  -2(a2),d2
  26915.   BLE     Error77
  26916.   MOVE.w  -4(a2),d3
  26917.   BLE     Error78
  26918.   !CCheckWindowFits3
  26919.   MOVEM.l (a7)+,d0-d3 ; Restore
  26920.   RTS
  26921.  
  26922. ;*************************************************************************************
  26923.  
  26924. _MZoomShapeCustomCheck
  26925.   MOVE.l  d0,-(a7) ; Store
  26926.   MOVE.l  d0,d6 ; Store
  26927.   MOVE.l  d1,d7 ; Store
  26928.   SWAP    d6
  26929.   SWAP    d7
  26930.   MOVE.w  -8(a2),d0
  26931.   !CThreeShapeChecks
  26932.   !GetShapeObjectPtr ; Source Base in a0
  26933.   !CCheckXYFits2
  26934.   MOVE.w  CurrentChunkyShape1,d0
  26935.   BLT     Error27
  26936.   !GetShapeObjectPtr ; Dest Base in a0
  26937.   TST.w  -2(a2)
  26938.   BLE     Error77
  26939.   TST.w  -4(a2)
  26940.   BLE     Error78
  26941.   !CCheckXYFits3
  26942.   MOVE.l  (a7)+,d0 ; Restore
  26943.   RTS
  26944. _MZoomShapeShortCheck
  26945.   MOVEM.l d0-d3,-(a7) ; Store
  26946.   MOVE.l  d0,d6 ; Store
  26947.   MOVE.l  d1,d7 ; Store
  26948.   SWAP    d6
  26949.   SWAP    d7
  26950.   MOVE.w   CurrentChunkyShape1,d0
  26951.   BLT     Error27
  26952.   BRA     _MZoomShapeSkip
  26953. _MZoomShapeCheck
  26954.   MOVEM.l d0-d3,-(a7) ; Store
  26955.   MOVE.l  d0,d6 ; Store
  26956.   MOVE.l  d1,d7 ; Store
  26957.   SWAP    d6
  26958.   SWAP    d7
  26959.   MOVE.w  -8(a2),d0
  26960.   !CThreeShapeChecks
  26961. _MZoomShapeSkip
  26962.   !GetShapeObjectPtr ; Source Base in a0
  26963.   !CCheckXYFits2
  26964.   MOVE.w  CurrentChunkyShape1,d0
  26965.   BLT     Error27
  26966.   !GetShapeObjectPtr ; Dest Base in a0
  26967.   MOVE.w  d4,d0
  26968.   MOVE.w  d5,d1
  26969.   MOVE.w  -2(a2),d2
  26970.   BLE     Error77
  26971.   MOVE.w  -4(a2),d3
  26972.   BLE     Error78
  26973.   !CCheckWindowFits3
  26974.   MOVEM.l (a7)+,d0-d3 ; Restore
  26975.   RTS
  26976.  
  26977. ;*************************************************************************************
  26978.  
  26979. _MZoomBitmapToShapeCustomCheck
  26980.   MOVE.l  d0,-(a7) ; Store
  26981.   MOVE.l  d0,d6 ; Store
  26982.   MOVE.l  d1,d7 ; Store
  26983.   SWAP    d6
  26984.   SWAP    d7
  26985.   MOVE.w  -8(a2),d0
  26986.   !CThreeBitmapChecks
  26987.   !GetBitmapObjectPtr ; Source Base in a0
  26988.   !CCheckXYFits2
  26989.   MOVE.w  CurrentChunkyShape1,d0
  26990.   BLT     Error27
  26991.   !GetShapeObjectPtr ; Dest Base in a0
  26992.   TST.w  -2(a2)
  26993.   BLE     Error77
  26994.   TST.w  -4(a2)
  26995.   BLE     Error78
  26996.   !CCheckXYFits3
  26997.   MOVE.l  (a7)+,d0 ; Restore
  26998.   RTS
  26999. _MZoomBitmapToShapeShortCheck
  27000.   MOVEM.l d0-d3,-(a7) ; Store
  27001.   MOVE.l  d0,d6 ; Store
  27002.   MOVE.l  d1,d7 ; Store
  27003.   SWAP    d6
  27004.   SWAP    d7
  27005.   MOVE.w   CurrentChunkyBitmap1,d0
  27006.   BLT     Error28
  27007.   BRA     _MZoomBitmapToShapeSkip
  27008. _MZoomBitmapToShapeCheck
  27009.   MOVEM.l d0-d3,-(a7) ; Store
  27010.   MOVE.l  d0,d6 ; Store
  27011.   MOVE.l  d1,d7 ; Store
  27012.   SWAP    d6
  27013.   SWAP    d7
  27014.   MOVE.w  -8(a2),d0
  27015.   !CThreeBitmapChecks
  27016. _MZoomBitmapToShapeSkip
  27017.   !GetBitmapObjectPtr ; Source Base in a0
  27018.   !CCheckXYFits2
  27019.   MOVE.w  CurrentChunkyShape1,d0
  27020.   BLT     Error27
  27021.   !GetShapeObjectPtr ; Dest Base in a0
  27022.   MOVE.w  d4,d0
  27023.   MOVE.w  d5,d1
  27024.   MOVE.w  -2(a2),d2
  27025.   BLE     Error77
  27026.   MOVE.w  -4(a2),d3
  27027.   BLE     Error78
  27028.   !CCheckWindowFits3
  27029.   MOVEM.l (a7)+,d0-d3 ; Restore
  27030.   RTS
  27031.  
  27032. ;*************************************************************************************
  27033.  
  27034. _MZoomShapeToBitmapCustomCheck
  27035.   MOVE.l  d0,-(a7) ; Store
  27036.   MOVE.l  d0,d6 ; Store
  27037.   MOVE.l  d1,d7 ; Store
  27038.   SWAP    d6
  27039.   SWAP    d7
  27040.   MOVE.w  -8(a2),d0
  27041.   !CThreeShapeChecks
  27042.   !GetShapeObjectPtr ; Source Base in a0
  27043.   !CCheckXYFits2
  27044.   MOVE.w  CurrentChunkyBitmap1,d0
  27045.   BLT     Error28
  27046.   !GetBitmapObjectPtr ; Dest Base in a0
  27047.   TST.w  -2(a2)
  27048.   BLE     Error77
  27049.   TST.w  -4(a2)
  27050.   BLE     Error28
  27051.   !CCheckXYFits3
  27052.   MOVE.l  (a7)+,d0 ; Restore
  27053.   RTS
  27054. _MZoomShapeToBitmapShortCheck
  27055.   MOVEM.l d0-d3,-(a7) ; Store
  27056.   MOVE.l  d0,d6 ; Store
  27057.   MOVE.l  d1,d7 ; Store
  27058.   SWAP    d6
  27059.   SWAP    d7
  27060.   MOVE.w   CurrentChunkyShape1,d0
  27061.   BLT     Error27
  27062.   BRA     _MZoomShapeToBitmapSkip
  27063. _MZoomShapeToBitmapCheck
  27064.   MOVEM.l d0-d3,-(a7) ; Store
  27065.   MOVE.l  d0,d6 ; Store
  27066.   MOVE.l  d1,d7 ; Store
  27067.   SWAP    d6
  27068.   SWAP    d7
  27069.   MOVE.w  -8(a2),d0
  27070.   !CThreeShapeChecks
  27071. _MZoomShapeToBitmapSkip
  27072.   !GetShapeObjectPtr ; Source Base in a0
  27073.   !CCheckXYFits2
  27074.   MOVE.w  CurrentChunkyBitmap1,d0
  27075.   BLT     Error28
  27076.   !GetBitmapObjectPtr ; Dest Base in a0
  27077.   MOVE.w  d4,d0
  27078.   MOVE.w  d5,d1
  27079.   MOVE.w  -2(a2),d2
  27080.   BLE     Error77
  27081.   MOVE.w  -4(a2),d3
  27082.   BLE     Error78
  27083.   !CCheckWindowFits3
  27084.   MOVEM.l (a7)+,d0-d3 ; Restore
  27085.   RTS
  27086.  
  27087. ;*************************************************************************************
  27088.  
  27089. .Messages
  27090.  
  27091. Error0: MOVE.l #Error0Txt,d0 : TRAP #0
  27092. Error1: MOVE.l #Error1Txt,d0 : TRAP #0
  27093. Error2: MOVE.l #Error2Txt,d0 : TRAP #0
  27094. Error3: MOVE.l #Error3Txt,d0 : TRAP #0
  27095. Error4: MOVE.l #Error4Txt,d0 : TRAP #0
  27096. Error5: MOVE.l #Error5Txt,d0 : TRAP #0
  27097. Error6: MOVE.l #Error6Txt,d0 : TRAP #0
  27098. Error7: MOVE.l #Error7Txt,d0 : TRAP #0
  27099. Error8: MOVE.l #Error8Txt,d0 : TRAP #0
  27100. Error9: MOVE.l #Error9Txt,d0 : TRAP #0
  27101. Error10: MOVE.l #Error10Txt,d0 : TRAP #0
  27102. Error11: MOVE.l #Error11Txt,d0 : TRAP #0
  27103. Error12: MOVE.l #Error12Txt,d0 : TRAP #0
  27104. Error13: MOVE.l #Error13Txt,d0 : TRAP #0
  27105. Error14: MOVE.l #Error14Txt,d0 : TRAP #0
  27106. Error15: MOVE.l #Error15Txt,d0 : TRAP #0
  27107. Error16: MOVE.l #Error16Txt,d0 : TRAP #0
  27108. Error17: MOVE.l #Error17Txt,d0 : TRAP #0
  27109. Error18: MOVE.l #Error18Txt,d0 : TRAP #0
  27110. Error19: MOVE.l #Error19Txt,d0 : TRAP #0
  27111. Error20: MOVE.l #Error20Txt,d0 : TRAP #0
  27112. Error21: MOVE.l #Error21Txt,d0 : TRAP #0
  27113. Error22: MOVE.l #Error22Txt,d0 : TRAP #0
  27114. Error23: MOVE.l #Error23Txt,d0 : TRAP #0
  27115. Error24: MOVE.l #Error24Txt,d0 : TRAP #0
  27116. Error25: MOVE.l #Error25Txt,d0 : TRAP #0
  27117. Error26: MOVE.l #Error26Txt,d0 : TRAP #0
  27118. Error27: MOVE.l #Error27Txt,d0 : TRAP #0
  27119. Error28: MOVE.l #Error28Txt,d0 : TRAP #0
  27120. Error29: MOVE.l #Error29Txt,d0 : TRAP #0
  27121. Error30: MOVE.l #Error30Txt,d0 : TRAP #0
  27122. Error31: MOVE.l #Error31Txt,d0 : TRAP #0
  27123. Error32: MOVE.l #Error32Txt,d0 : TRAP #0
  27124. Error33: MOVE.l #Error33Txt,d0 : TRAP #0
  27125. Error34: MOVE.l #Error34Txt,d0 : TRAP #0
  27126. Error35: MOVE.l #Error35Txt,d0 : TRAP #0
  27127. Error36: MOVE.l #Error36Txt,d0 : TRAP #0
  27128. Error37: MOVE.l #Error37Txt,d0 : TRAP #0
  27129. Error38: MOVE.l #Error38Txt,d0 : TRAP #0
  27130. Error39: MOVE.l #Error39Txt,d0 : TRAP #0
  27131. Error40: MOVE.l #Error40Txt,d0 : TRAP #0
  27132. Error41: MOVE.l #Error41Txt,d0 : TRAP #0
  27133. Error42: MOVE.l #Error42Txt,d0 : TRAP #0
  27134. Error43: MOVE.l #Error43Txt,d0 : TRAP #0
  27135. Error44: MOVE.l #Error44Txt,d0 : TRAP #0
  27136. Error45: MOVE.l #Error45Txt,d0 : TRAP #0
  27137. Error46: MOVE.l #Error46Txt,d0 : TRAP #0
  27138. Error47: MOVE.l #Error47Txt,d0 : TRAP #0
  27139. Error48: MOVE.l #Error48Txt,d0 : TRAP #0
  27140. Error49: MOVE.l #Error49Txt,d0 : TRAP #0
  27141. Error50: MOVE.l #Error50Txt,d0 : TRAP #0
  27142. Error51: MOVE.l #Error51Txt,d0 : TRAP #0
  27143. Error52: MOVE.l #Error52Txt,d0 : TRAP #0
  27144. Error53: MOVE.l #Error53Txt,d0 : TRAP #0
  27145. Error54: MOVE.l #Error54Txt,d0 : TRAP #0
  27146. Error55: MOVE.l #Error55Txt,d0 : TRAP #0
  27147. Error56: MOVE.l #Error56Txt,d0 : TRAP #0
  27148. Error57: MOVE.l #Error57Txt,d0 : TRAP #0
  27149. Error58: MOVE.l #Error58Txt,d0 : TRAP #0
  27150. Error59: MOVE.l #Error59Txt,d0 : TRAP #0
  27151. Error60: MOVE.l #Error60Txt,d0 : TRAP #0
  27152. Error61: MOVE.l #Error61Txt,d0 : TRAP #0
  27153. Error62: MOVE.l #Error62Txt,d0 : TRAP #0
  27154. Error63: MOVE.l #Error63Txt,d0 : TRAP #0
  27155. Error64: MOVE.l #Error64Txt,d0 : TRAP #0
  27156. Error65: MOVE.l #Error65Txt,d0 : TRAP #0
  27157. Error66: MOVE.l #Error66Txt,d0 : TRAP #0
  27158. Error67: MOVE.l #Error67Txt,d0 : TRAP #0
  27159. Error68: MOVE.l #Error68Txt,d0 : TRAP #0
  27160. Error69: MOVE.l #Error69Txt,d0 : TRAP #0
  27161. Error70: MOVE.l #Error70Txt,d0 : TRAP #0
  27162. Error71: MOVE.l #Error71Txt,d0 : TRAP #0
  27163. Error72: MOVE.l #Error72Txt,d0 : TRAP #0
  27164. Error73: MOVE.l #Error73Txt,d0 : TRAP #0
  27165. Error74: MOVE.l #Error74Txt,d0 : TRAP #0
  27166. Error75: MOVE.l #Error75Txt,d0 : TRAP #0
  27167. Error76: MOVE.l #Error76Txt,d0 : TRAP #0
  27168. Error77: MOVE.l #Error77Txt,d0 : TRAP #0
  27169. Error78: MOVE.l #Error78Txt,d0 : TRAP #0
  27170. Error0Txt: Dc.b "c2pWindow number out of range",0
  27171. Error1Txt: Dc.b "Chunky address of zero is not allowed",0
  27172. Error2Txt: Dc.b "Planar address of zero is not allowed",0
  27173. Error3Txt: Dc.b "Requested new height is out of range",0
  27174. Error4Txt: Dc.b "Operation/Window width is out of range",0
  27175. Error5Txt: Dc.b "Operation/Window width should be a multiple of 32!",0
  27176. Error6Txt: Dc.b "Operation/Window height is out of range",0
  27177. Error7Txt: Dc.b "Processor should be in the range 0..4 (4=040,<4=030)",0
  27178. Error8Txt: Dc.b "Source Byte-Width (bytes per rasterline) is out of range",0
  27179. Error9Txt: Dc.b "Width of planar display is out of range",0
  27180. Error10Txt: Dc.b "Width of planar display must be a multiple of 32 pixels",0
  27181. Error11Txt: Dc.b "Height of planar display is out of range",0
  27182. Error12Txt: Dc.b "Buffering should be 1 (single), 2 (double) or 3 (triple)",0
  27183. Error13Txt: Dc.b "Current buffer should be 0, 1 or 2",0
  27184. Error14Txt: Dc.b "Specified current-buffer number too high",0
  27185. Error15Txt: Dc.b "Current buffer should be 0 or 1",0
  27186. Error16Txt: Dc.b "c2pWindows not available. Use MReservec2pWindows",0
  27187. Error17Txt: Dc.b "The specified c2pWindow object is undefined",0
  27188. Error18Txt: Dc.b "Number of objects shouldn't be more than signed-word limit",0
  27189. Error19Txt: Dc.b "Bitmaps not available. Use MReserveBitmaps",0
  27190. Error20Txt: Dc.b "Bitmap number out of range",0
  27191. Error21Txt: Dc.b "The specified Bitmap object is undefined",0
  27192. Error22Txt: Dc.b "Shapes not available. Use MReserveShapes",0
  27193. Error23Txt: Dc.b "Shape number out of range",0
  27194. Error24Txt: Dc.b "The specified Shape object is undefined",0
  27195. Error25Txt: Dc.b "Number of objects should be greater than 0",0
  27196. Error26Txt: Dc.b "No currently used c2pWindow object",0
  27197. Error27Txt: Dc.b "No currently used Shape object",0
  27198. Error28Txt: Dc.b "No currently used Bitmap object",0
  27199. Error29Txt: Dc.b "Width should be a signed-word greater than 0",0
  27200. Error30Txt: Dc.b "Height should be a signed-word greater than 0",0
  27201. Error31Txt: Dc.b "The source Shape does not have a Cookie",0
  27202. Error32Txt: Dc.b "The dest Shape does not have a Cookie",0
  27203. Error33Txt: Dc.b "The source Bitmap does not have a Stencil",0
  27204. Error34Txt: Dc.b "The dest Bitmap does not have a Stencil",0
  27205. Error35Txt: Dc.b "Only shape bank numbers of 0 to 31 inclusive are allowed",0
  27206. Error36Txt: Dc.b "First c2pWindow shouldn't be greater than Second c2pWindow",0
  27207. Error37Txt: Dc.b "First Shape number shouldn't be greater than second Shape number",0
  27208. Error38Txt: Dc.b "First Bitmap number shouldn't be greater than second Bitmap number",0
  27209. Error39Txt: Dc.b "X must be within the existing dimensions",0
  27210. Error40Txt: Dc.b "Y must be within the existing dimensions",0
  27211. Error41Txt: Dc.b "Requested Width is too small",0
  27212. Error42Txt: Dc.b "Requested Width makes window fall outside existing dimensions",0
  27213. Error43Txt: Dc.b "Requested Height is too small",0
  27214. Error44Txt: Dc.b "Requested Height makes window fall outside existing dimensions",0
  27215. Error45Txt: Dc.b "The specified Shape does not have a Cookie",0
  27216. Error46Txt: Dc.b "The specified Bitmap does not have a Stencil",0
  27217. Error47Txt: Dc.b "There is no currently used source bitmap",0
  27218. Error48Txt: Dc.b "There is no currently used destination bitmap",0
  27219. Error49Txt: Dc.b "The pic-bitmap has different size clip area to dest bitmap",0
  27220. Error50Txt: Dc.b "The source-bitmap has different size clip area to dest bitmap",0
  27221. Error51Txt: Dc.b "The pic-bitmap is a different size to the dest bitmap",0
  27222. Error52Txt: Dc.b "The source-bitmap is a different size to the dest bitmap",0
  27223. Error53Txt: Dc.b "Mode not recognised/available",0
  27224. Error54Txt: Dc.b "Negative number for mode is not allowed",0
  27225. Error55Txt: Dc.b "The Shape's width must be a multiple of 16!",0
  27226. Error56Txt: Dc.b "First Queue number shouldn't be greater than second Queue number",0
  27227. Error57Txt: Dc.b "Queues not available. Use MReserveQueues",0
  27228. Error58Txt: Dc.b "Queue number out of range",0
  27229. Error59Txt: Dc.b "The specified Queue object is undefined",0
  27230. Error60Txt: Dc.b "Number of items out of range",0
  27231. Error61Txt: Dc.b "No currently used Queue object",0
  27232. Error62Txt: Dc.b "The queue is already full",0
  27233. Error63Txt: Dc.b "The queue is already empty",0
  27234. Error64Txt: Dc.b "Width should be greater than 0",0
  27235. Error65Txt: Dc.b "Address of 0 is not allowed",0
  27236. Error66Txt: Dc.b "First QueueItem number shouldn't be greater than second QueueItem number",0
  27237. Error67Txt: Dc.b "X1 should be within the object's dimensions",0
  27238. Error68Txt: Dc.b "Y1 should be within the object's dimensions",0
  27239. Error69Txt: Dc.b "X2 should be within the object's dimensions",0
  27240. Error70Txt: Dc.b "Y2 should be within the object's dimensions",0
  27241. Error71Txt: Dc.b "Colour number out of range",0
  27242. Error72Txt: Dc.b "No currently used Table object",0
  27243. Error73Txt: Dc.b "Tables not available. Use MReserveTables",0
  27244. Error74Txt: Dc.b "Table number out of range",0
  27245. Error75Txt: Dc.b "The specified Table object is undefined",0
  27246. Error76Txt: Dc.b "Number of pixels should not be 0",0
  27247. Error77Txt: Dc.b "OpWidth should be at least 1 pixel",0
  27248. Error78Txt: Dc.b "OpHeight should be at least 1 row",0
  27249.   Even4
  27250.  
  27251.  
  27252.